{"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-3896d89ec62ba061", "name": "Stray `console.log` in TS/JS \u2014 test-scan.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-scan.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-d51b09d77119bfbf", "name": "Stray `console.log` in TS/JS \u2014 generate_scenarios.js:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 generate_scenarios.js:72"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec9966b51bec0509", "name": "Stray `console.log` in TS/JS \u2014 test.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 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-3f33af789c827093", "name": "Stray `console.log` in TS/JS \u2014 apps/api/test_pooler_5432.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/test_pooler_5432.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-8386e957b4a43dd6", "name": "Stray `console.log` in TS/JS \u2014 apps/api/test_balance.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/test_balance.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-2a054650d65c7b00", "name": "Stray `console.log` in TS/JS \u2014 apps/api/trace_corrupted_run.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/trace_corrupted_run.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-4393b9064e296002", "name": "Stray `console.log` in TS/JS \u2014 apps/api/list_all_tables.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/list_all_tables.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-0a23835dfd045ff2", "name": "Stray `console.log` in TS/JS \u2014 apps/api/search_transcript_mcp.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/search_transcript_mcp.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-42bae6fca3532ba6", "name": "Stray `console.log` in TS/JS \u2014 apps/api/list_accounts.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/list_accounts.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-f26ee588fab5d1e6", "name": "Stray `console.log` in TS/JS \u2014 apps/api/reset.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/reset.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-3f5d1acf372d41bf", "name": "Stray `console.log` in TS/JS \u2014 apps/api/test_pg.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/test_pg.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-7e2ff5bc763429b3", "name": "Stray `console.log` in TS/JS \u2014 apps/api/run-migration.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/run-migration.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-0bb13b0542ea2f8e", "name": "Stray `console.log` in TS/JS \u2014 apps/api/search_transcript_full.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/search_transcript_full.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-fdc8c94e87c187c3", "name": "Stray `console.log` in TS/JS \u2014 apps/api/search_transcript_prev_session.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/search_transcript_prev_session.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-3e42f49372a926fa", "name": "Stray `console.log` in TS/JS \u2014 apps/api/recalculate_other_ledgers.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/recalculate_other_ledgers.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-672bc6a5851ebbc4", "name": "Stray `console.log` in TS/JS \u2014 apps/api/check.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/check.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-ac5fec0f5e87fd6f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/fix_ledger.js:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/fix_ledger.js:45"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c3b60203a64b52d4", "name": "Stray `console.log` in TS/JS \u2014 apps/api/read_log_history.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/read_log_history.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-1930214a1f71e94f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/inspect.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/inspect.js:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0fd4ef945b64be23", "name": "Stray `console.log` in TS/JS \u2014 apps/api/fix.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/fix.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-f1d8bf62a568e24b", "name": "Stray `console.log` in TS/JS \u2014 apps/api/read_log.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/read_log.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-d56826179d8f83c5", "name": "Stray `console.log` in TS/JS \u2014 apps/api/read_steps_120_140.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/read_steps_120_140.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-ebead068f1dc2ddc", "name": "Stray `console.log` in TS/JS \u2014 apps/api/run-new-migration.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/run-new-migration.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-7c57e26795865545", "name": "Stray `console.log` in TS/JS \u2014 apps/api/query.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/query.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-39a1331dc0df469c", "name": "Stray `console.log` in TS/JS \u2014 apps/api/dump_entries.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/dump_entries.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-f34cdb78393ed685", "name": "Stray `console.log` in TS/JS \u2014 apps/api/read_all_history.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/read_all_history.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-9f172cb50dd40e28", "name": "Stray `console.log` in TS/JS \u2014 apps/api/api/index.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/api/index.ts:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-794d21ba6a3dbcc0", "name": "Stray `console.log` in TS/JS \u2014 apps/api/supabase/functions/run-migration/index.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/supabase/functions/run-migration/index.ts:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5dfcbd6f2c8b52ab", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/delete_user.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/delete_user.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-39dc79ddb5739552", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.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-932da961661faa94", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/test_edge_cases.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/test_edge_cases.ts:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb3c503289e0f2d8", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/inspect_req_2.ts:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/inspect_req_2.ts:4"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-712e9dd11920a1de", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/repair_stuck_requisitions.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/repair_stuck_requisitions.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-e6a5d89d774f2e44", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/check_lenco_status.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/check_lenco_status.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-040c0de30ee39218", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/wipeout_research.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/wipeout_research.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-715c2605ab77c043", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/middleware/auth.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/middleware/auth.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-669caabf842eda55", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/fix_dates_and_recalculate.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/fix_dates_and_recalculate.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-462df0fcfe7c08bc", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/reconcile_wallet_ledger.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/reconcile_wallet_ledger.ts:30"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-09dc3d87386fe031", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/lenco_source_of_truth_reconcile.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/lenco_source_of_truth_reconcile.ts:64"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f8e070f2e0a3c45", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/test_payroll_disbursal.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/test_payroll_disbursal.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c24c19d3a1be8d3", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/reconcile_amatoasts_day.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/reconcile_amatoasts_day.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-a9f872e16acf7796", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/diagnose_ledger.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/diagnose_ledger.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-062ffd869c6dacfd", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/debug-qb.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/debug-qb.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-bc373565ae2c6e97", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/repair_missing_ledger_entries.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/repair_missing_ledger_entries.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-a0c3c8f96551ee9f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/sweep_stranded_commissions.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/sweep_stranded_commissions.ts:51"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd5de6e72fc13331", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/add_external_reference.ts:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/add_external_reference.ts:4"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce950aa16a8bf814", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/check-lenco-balance.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/check-lenco-balance.ts:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5fa214b2f2d10653", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/supabase.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/supabase.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-c601a6209fcad984", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/accounting.controller.ts:104", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/accounting.controller.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-210954ef2359f330", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/organization.controller.ts:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/organization.controller.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-4d04589d63f61333", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/disbursement.controller.ts:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/disbursement.controller.ts:121"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f2b8f4a9da94c1ef", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/requisition.controller.ts:292", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/requisition.controller.ts:292"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3c3151da7798ab81", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/auth.controller.ts:90", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/auth.controller.ts:90"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dc04362e9a6e2539", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/lenco.webhook.controller.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/lenco.webhook.controller.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-e648cf35fc1302f7", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/lenco.controller.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/lenco.controller.ts:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9425a0a349a01fbe", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/user.controller.ts:156", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/user.controller.ts: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-e0feedbdc3413132", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/cashbook.controller.ts:351", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/cashbook.controller.ts:351"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-73bebeb38eb509d4", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/ai.controller.ts:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/ai.controller.ts:102"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-311b17780c47373d", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/account.controller.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/account.controller.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7f501f75f013cf8f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/audit.service.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/audit.service.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-827a48f841712ceb", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/cashbook.service.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/cashbook.service.ts:79"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-380aff1901af8856", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/email.service.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/email.service.ts:126"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1eb9fb3340186145", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/quickbooks.service.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/quickbooks.service.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ba77f5fb0f5a8359", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/requisition_message.service.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/requisition_message.service.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-68e1c96381b51876", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/learning.validator.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/learning.validator.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b5f7e959f306df8", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/rule.engine.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/rule.engine.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-6969d008da34620d", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/memory.service.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/memory.service.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99b80c1b28f4315c", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/ai.service.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/ai.service.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-f5ca9e4df57e1246", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/ocr.service.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/ocr.service.ts:109"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c83af7e38752f7a", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/decision.router.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/decision.router.ts:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e11633e5612d094", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/index.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/index.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-edbf04fe86cb7a80", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/migrate.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/migrate.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-669009c55c677105", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/migrate-fix.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/migrate-fix.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-ab52781ce71927d5", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/migrate-update.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/migrate-update.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fb0f48b75cc18a97", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/DisbursementDetailOverlay.tsx:309", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/DisbursementDetailOverlay.tsx:309"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60329bb6f6419fea", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/CashInflowModal.tsx:149", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/CashInflowModal.tsx:149"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2e4c0fcaf86a8305", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/PWAInstallPrompt.tsx:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/PWAInstallPrompt.tsx:30"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9494bdb23ab07ac2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/Layout.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/Layout.tsx:117"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac792bf02d98d1e7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/TopNavbar.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/TopNavbar.tsx:119"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-646f3736f652191f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/settings/ChartOfAccounts.tsx:159", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/settings/ChartOfAccounts.tsx:159"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b944df208a4f2f9c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/settings/ProductSettings.tsx:286", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/settings/ProductSettings.tsx:286"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1037fe51494cfd0d", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/accounting/AccountingModal.tsx:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/accounting/AccountingModal.tsx:109"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dc66988d94b61615", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/requisitions/RequisitionMessageCard.tsx:861", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/requisitions/RequisitionMessageCard.tsx:861"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7d19dbeb6216bd1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/requisitions/RequisitionAttachments.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/requisitions/RequisitionAttachments.tsx:195"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0ef2b7154fbcc8ad", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/requisitions/MobilePayrollWizard.tsx:678", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/requisitions/MobilePayrollWizard.tsx:678"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b4d73c2cd2f869a5", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/src/components/requisitions/RequisitionDocumentTemplates.tsx:158", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/components/requisitions/RequisitionDocumentTemplates.tsx:158"}, "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-b8b4e6731f89006b", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/api.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/api.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-eb32f98bd4885336", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Reporting.tsx:1060", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Reporting.tsx:1060"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23db930ea43526c1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Vouchers.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Vouchers.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fdde3a2964849761", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Menu.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Menu.tsx:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-423993f3e9f2eccd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/PublicPay.tsx:743", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/PublicPay.tsx:743"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2cad8c189deaee0", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/pages/PublicPay.tsx:224", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/pages/PublicPay.tsx:224"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77868a4f9c1d93cc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/CashierDashboard.tsx:517", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/CashierDashboard.tsx:517"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d9f286bdac8066a", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/pages/CashierDashboard.tsx:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/pages/CashierDashboard.tsx:124"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d2e618c0cb72d95b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Login.tsx:382", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Login.tsx:382"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1eec68217676324b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Settings.tsx:486", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Settings.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-33f23223168b9552", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/pages/Settings.tsx:158", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/pages/Settings.tsx:158"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f01efb03dd55ce53", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Audit.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Audit.tsx:151"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d86bea4f787e786e", "name": "Stray `console.log` in TS/JS \u2014 scripts/repair_stuck_requisitions.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/repair_stuck_requisitions.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-598ea602c4a8d798", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/run-migration/index.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/run-migration/index.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-f838eb775b7a5b67", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/sync-lenco-transactions/index.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/sync-lenco-transactions/index.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d2720d50597bd234", "name": "Insecure pattern 'cors_wildcard' in apps/api/src/index.ts:316", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in apps/api/src/index.ts:316"}, "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-0af5814e217ca789", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/classify-requisition/index.ts:6", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/classify-requisition/index.ts:6"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bfa807263b0cea57", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/sync-lenco-transactions/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/sync-lenco-transactions/index.ts:4"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1834f70debc61d50", "name": "Very large file: apps/api/src/controllers/disbursement.controller.ts (1592 lines)", "shortDescription": {"text": "Very large file: apps/api/src/controllers/disbursement.controller.ts (1592 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-f110afcfb2543faa", "name": "Very large file: apps/api/src/controllers/requisition.controller.ts (2564 lines)", "shortDescription": {"text": "Very large file: apps/api/src/controllers/requisition.controller.ts (2564 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-ab88936712bfe784", "name": "Very large file: apps/api/src/controllers/lenco.controller.ts (1739 lines)", "shortDescription": {"text": "Very large file: apps/api/src/controllers/lenco.controller.ts (1739 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-6bc7b750ce3b74e0", "name": "Very large file: apps/web/src/components/requisitions/RequisitionMessageCard.tsx (3392 lines)", "shortDescription": {"text": "Very large file: apps/web/src/components/requisitions/RequisitionMessageCard.tsx (3392 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-46db2bf0ac915d6a", "name": "Very large file: apps/web/src/pages/Reporting.tsx (2116 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/Reporting.tsx (2116 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-f948b74fc8108e1d", "name": "Very large file: apps/web/src/pages/RequisitionCreate.tsx (1115 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/RequisitionCreate.tsx (1115 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-9672428b35c707a9", "name": "Very large file: apps/web/src/pages/PublicPay.tsx (1146 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/PublicPay.tsx (1146 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-a663ac21b31f7c4b", "name": "Very large file: apps/web/src/pages/CashierDashboard.tsx (1012 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/CashierDashboard.tsx (1012 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-2e15b8f1d0d0c998", "name": "Very large file: apps/web/src/pages/CashLedger.tsx (2634 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/CashLedger.tsx (2634 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": "8 test file(s) for 190 source file(s) (ratio 0.04). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/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-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-2699d5f16ae11282", "name": "Node manifest has dependencies but no lockfile: packages/shared/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared/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 633 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 153 placeholder/mock markers across 38 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: ci, 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-c9ba995ccbb9eede", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/debug-qb.ts:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/debug-qb.ts:46"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-855bcb355532736d", "name": "Commented-code block (5 lines) in apps/api/src/controllers/requisition.controller.ts:1167", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/controllers/requisition.controller.ts:1167"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd6c3381b90b9dae", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/controllers/requisition.controller.ts:430", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/controllers/requisition.controller.ts:430"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63f9e866234e7ce8", "name": "Commented-code block (7 lines) in apps/api/src/controllers/lenco.controller.ts:1092", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/controllers/lenco.controller.ts:1092"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d715cafd43824be3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/controllers/ai.controller.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/controllers/ai.controller.ts:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1a0055825bd7292c", "name": "Commented-code block (5 lines) in apps/api/src/services/cashbook.service.ts:626", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/services/cashbook.service.ts:626"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f45bee72a2785ad9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/quickbooks.service.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/quickbooks.service.ts:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7096a4e143e7b5a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/ai/ai.service.ts:177", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/ai/ai.service.ts:177"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-57767a1a41560092", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/ai/ocr.service.ts:142", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/ai/ocr.service.ts:142"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fd2c43e95e39bdfb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/api.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/api.ts:32"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37f42960383d5a55", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Join.tsx:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Join.tsx:60"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0376ec7974a19776", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/CashierDashboard.tsx:380", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/CashierDashboard.tsx:380"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0f8916b802db6624", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/account.service.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/account.service.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-3fa67b10b6c15b1c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/budget.service.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/budget.service.ts:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-849f6c88e5e4ba55", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/lenco.service.ts:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/lenco.service.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-d4205782870976c6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/report.service.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/report.service.ts:34"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-250ca965ffc4afbb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/user.service.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/user.service.ts:21"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-24b6021966392e62", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/integration.service.ts:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/integration.service.ts: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-b930587a8c5266c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/voucher.service.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/voucher.service.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-562cd07709e679ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/context/AuthContext.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/context/AuthContext.tsx:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-59c9b791de698a05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/sync-lenco-transactions/index.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/sync-lenco-transactions/index.ts:19"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d6ffa20a9f1093b", "name": "24 env vars used in code but missing from .env.example", "shortDescription": {"text": "24 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_TEST_MODE`, `DATABASE_URL`, `DIRECT_DATABASE_URL`, `DRY_RUN`, `EMAIL_FROM`, `FRONTEND_URL`, `GEMINI_API_KEY`, `LENCO_SECRET_KEY` + 16 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-523d0a4fa1ae98e1", "name": "Frontend route `/join` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/join` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-70ff7629e52bda11", "name": "Frontend route `/disconnect` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/disconnect` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3cd351ea4a9f8b62", "name": "Frontend route `/pay/:wallet_id` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/pay/:wallet_id` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6796e326bb745fbf", "name": "Frontend route `/vouchers/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/vouchers/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d055e571d48f2afc", "name": "Dangling fetch: POST https://api.supabase.com/v1/projects/${PROJECT_REF}/database/query (apps/api/run-new-migration.js:1", "shortDescription": {"text": "Dangling fetch: POST https://api.supabase.com/v1/projects/${PROJECT_REF}/database/query (apps/api/run-new-migration.js:15)"}, "fullDescription": {"text": "`apps/api/run-new-migration.js:15` calls `POST https://api.supabase.com/v1/projects/${PROJECT_REF}/database/query` 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.supabase.com/v1/projects/<p>/database/query`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-15816bc0580e42ec", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/services/ai/ai.service.ts:177)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/services/ai/ai.service.ts:177)"}, "fullDescription": {"text": "`apps/api/src/services/ai/ai.service.ts:177` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da8b09cd9ead4660", "name": "Dangling fetch: POST https://api.openai.com/v1/embeddings (apps/api/src/services/ai/embedding.service.ts:25)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (apps/api/src/services/ai/embedding.service.ts:25)"}, "fullDescription": {"text": "`apps/api/src/services/ai/embedding.service.ts:25` calls `POST https://api.openai.com/v1/embeddings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/embeddings`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a47d130e373e385b", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (supabase/functions/classify-requisition/index.ts:152)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (supabase/functions/classify-requisition/index.ts:152)"}, "fullDescription": {"text": "`supabase/functions/classify-requisition/index.ts:152` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b28d92215a503990", "name": "Unused endpoint: USE /auth", "shortDescription": {"text": "Unused endpoint: USE /auth"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /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-7e286e13f14d94bb", "name": "Unused endpoint: USE /requisitions", "shortDescription": {"text": "Unused endpoint: USE /requisitions"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /requisitions` 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-ba095fbd2fa5f4fa", "name": "Unused endpoint: USE /accounts", "shortDescription": {"text": "Unused endpoint: USE /accounts"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /accounts` 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-ce730065f0ff3157", "name": "Unused endpoint: USE /vouchers", "shortDescription": {"text": "Unused endpoint: USE /vouchers"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /vouchers` 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-f3c3d755b27c944d", "name": "Unused endpoint: USE /cashbook", "shortDescription": {"text": "Unused endpoint: USE /cashbook"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /cashbook` 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-fd458eb13d1de46b", "name": "Unused endpoint: USE /integrations", "shortDescription": {"text": "Unused endpoint: USE /integrations"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /integrations` 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-4e480cf1bc736555", "name": "Unused endpoint: USE /users", "shortDescription": {"text": "Unused endpoint: USE /users"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /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-6bdcbf2073dfa768", "name": "Unused endpoint: USE /ai", "shortDescription": {"text": "Unused endpoint: USE /ai"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /ai` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77f68a230eae1580", "name": "Unused endpoint: USE /organizations", "shortDescription": {"text": "Unused endpoint: USE /organizations"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /organizations` 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-bae325190cb2c337", "name": "Unused endpoint: USE /organizations/products", "shortDescription": {"text": "Unused endpoint: USE /organizations/products"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /organizations/products` 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-9b4bf921f3e5cc45", "name": "Unused endpoint: USE /budgets", "shortDescription": {"text": "Unused endpoint: USE /budgets"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /budgets` 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-7a8f40a426fdfb45", "name": "Unused endpoint: USE /reports", "shortDescription": {"text": "Unused endpoint: USE /reports"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /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-44a5043c29ec91aa", "name": "Unused endpoint: USE /lenco", "shortDescription": {"text": "Unused endpoint: USE /lenco"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /lenco` 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/index.ts` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`apps/api/src/routes/voucher.routes.ts` 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/voucher.routes.ts` 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-e216611c1ac8b843", "name": "Unused endpoint: POST /:id/post", "shortDescription": {"text": "Unused endpoint: POST /:id/post"}, "fullDescription": {"text": "`apps/api/src/routes/voucher.routes.ts` declares `POST /:id/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-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`apps/api/src/routes/auth.routes.ts` declares `POST /register` 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-8d16b1bb2723f51e", "name": "Unused endpoint: POST /signup", "shortDescription": {"text": "Unused endpoint: POST /signup"}, "fullDescription": {"text": "`apps/api/src/routes/auth.routes.ts` declares `POST /signup` 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-11b11f92b74f3208", "name": "Unused endpoint: POST /resolve-username", "shortDescription": {"text": "Unused endpoint: POST /resolve-username"}, "fullDescription": {"text": "`apps/api/src/routes/auth.routes.ts` declares `POST /resolve-username` 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-e4b1308838798a52", "name": "Unused endpoint: GET /organizations/search", "shortDescription": {"text": "Unused endpoint: GET /organizations/search"}, "fullDescription": {"text": "`apps/api/src/routes/auth.routes.ts` declares `GET /organizations/search` 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-f32ff565587ae0ff", "name": "Unused endpoint: POST /join-request", "shortDescription": {"text": "Unused endpoint: POST /join-request"}, "fullDescription": {"text": "`apps/api/src/routes/auth.routes.ts` declares `POST /join-request` 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-ffb7610bb9cde0ae", "name": "Unused endpoint: POST /complete-invitation", "shortDescription": {"text": "Unused endpoint: POST /complete-invitation"}, "fullDescription": {"text": "`apps/api/src/routes/auth.routes.ts` declares `POST /complete-invitation` 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-8f413679e3ff80b1", "name": "Unused endpoint: GET /my-organizations", "shortDescription": {"text": "Unused endpoint: GET /my-organizations"}, "fullDescription": {"text": "`apps/api/src/routes/auth.routes.ts` declares `GET /my-organizations` 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-3bd75b5fdc09c316", "name": "Unused endpoint: POST /switch-organization", "shortDescription": {"text": "Unused endpoint: POST /switch-organization"}, "fullDescription": {"text": "`apps/api/src/routes/auth.routes.ts` declares `POST /switch-organization` 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-be4cb5e3cabcce80", "name": "Unused endpoint: POST /import", "shortDescription": {"text": "Unused endpoint: POST /import"}, "fullDescription": {"text": "`apps/api/src/routes/account.routes.ts` declares `POST /import` 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-27cc2bb73ad635b3", "name": "Unused endpoint: POST /suggest", "shortDescription": {"text": "Unused endpoint: POST /suggest"}, "fullDescription": {"text": "`apps/api/src/routes/account.routes.ts` declares `POST /suggest` 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-8d5b2b188d08ca82", "name": "Unused endpoint: PUT /:id", "shortDescription": {"text": "Unused endpoint: PUT /:id"}, "fullDescription": {"text": "`apps/api/src/routes/account.routes.ts` declares `PUT /: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-67d28fa8cd6bb12f", "name": "Unused endpoint: PUT /", "shortDescription": {"text": "Unused endpoint: PUT /"}, "fullDescription": {"text": "`apps/api/src/routes/organization.routes.ts` declares `PUT /` 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-3b30f4c0994a30b4", "name": "Unused endpoint: DELETE /", "shortDescription": {"text": "Unused endpoint: DELETE /"}, "fullDescription": {"text": "`apps/api/src/routes/organization.routes.ts` declares `DELETE /` 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-b63da4853e3e9d15", "name": "Unused endpoint: GET /admin/all", "shortDescription": {"text": "Unused endpoint: GET /admin/all"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `GET /admin/all` 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-f39249a345a19765", "name": "Unused endpoint: PATCH /:id/status", "shortDescription": {"text": "Unused endpoint: PATCH /:id/status"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `PATCH /:id/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b7e649f61cd2b2c2", "name": "Unused endpoint: POST /:id/revert-to-draft", "shortDescription": {"text": "Unused endpoint: POST /:id/revert-to-draft"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/revert-to-draft` 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-37240bfd6a9852a7", "name": "Unused endpoint: GET /reports/audit", "shortDescription": {"text": "Unused endpoint: GET /reports/audit"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `GET /reports/audit` 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-a02373eb965ad909", "name": "Unused endpoint: POST /maintenance/backfill-audit", "shortDescription": {"text": "Unused endpoint: POST /maintenance/backfill-audit"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /maintenance/backfill-audit` 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-c573e386622141fa", "name": "Unused endpoint: GET /disbursements/history", "shortDescription": {"text": "Unused endpoint: GET /disbursements/history"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `GET /disbursements/history` 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-7161913886771dde", "name": "Unused endpoint: POST /:id/disburse", "shortDescription": {"text": "Unused endpoint: POST /:id/disburse"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/disburse` 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-f43bfc193eff785d", "name": "Unused endpoint: POST /:id/disburse-payroll", "shortDescription": {"text": "Unused endpoint: POST /:id/disburse-payroll"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/disburse-payroll` 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-a50a6c6cda885fd4", "name": "Unused endpoint: POST /:id/disburse-excess", "shortDescription": {"text": "Unused endpoint: POST /:id/disburse-excess"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/disburse-excess` 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-82ec66a297b45e6f", "name": "Unused endpoint: POST /:id/acknowledge", "shortDescription": {"text": "Unused endpoint: POST /:id/acknowledge"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/acknowledge` 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-2a1ef057b0ac510e", "name": "Unused endpoint: PATCH /disbursements/:id", "shortDescription": {"text": "Unused endpoint: PATCH /disbursements/:id"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `PATCH /disbursements/: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-3df7325c0b2f1277", "name": "Unused endpoint: POST /disbursements/:id/analyze-proof", "shortDescription": {"text": "Unused endpoint: POST /disbursements/:id/analyze-proof"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /disbursements/:id/analyze-proof` 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-f26cd1e2155ecbb7", "name": "Unused endpoint: GET /:id/verify-disbursement", "shortDescription": {"text": "Unused endpoint: GET /:id/verify-disbursement"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `GET /:id/verify-disbursement` 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-aa5c6b5b2f384fa0", "name": "Unused endpoint: PUT /:id/expenses", "shortDescription": {"text": "Unused endpoint: PUT /:id/expenses"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `PUT /:id/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-c21abb6a92ac1da9", "name": "Unused endpoint: POST /:id/scan-receipts", "shortDescription": {"text": "Unused endpoint: POST /:id/scan-receipts"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/scan-receipts` 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-4971f38c134754e4", "name": "Unused endpoint: POST /:id/items/:itemId/analyze-receipt", "shortDescription": {"text": "Unused endpoint: POST /:id/items/:itemId/analyze-receipt"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/items/:itemId/analyze-receipt` 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-00c1271e9d7e4494", "name": "Unused endpoint: POST /:id/submit-change", "shortDescription": {"text": "Unused endpoint: POST /:id/submit-change"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/submit-change` 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-feedf5be663d9224", "name": "Unused endpoint: POST /:id/confirm-change", "shortDescription": {"text": "Unused endpoint: POST /:id/confirm-change"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/confirm-change` 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-67ef32b1514f1895", "name": "Unused endpoint: POST /:id/post-voucher", "shortDescription": {"text": "Unused endpoint: POST /:id/post-voucher"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/post-voucher` 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-9bd5300f2cbb3465", "name": "Unused endpoint: POST /:id/approve-categorization", "shortDescription": {"text": "Unused endpoint: POST /:id/approve-categorization"}, "fullDescription": {"text": "`apps/api/src/routes/requisition.routes.ts` declares `POST /:id/approve-categorization` 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/21752"}, "properties": {"repository": "twalumbu-prog/MoneyWise-Pro", "repoUrl": "https://github.com/twalumbu-prog/MoneyWise-Pro", "branch": "main"}, "results": [{"ruleId": "scanner-3896d89ec62ba061", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-scan.js:19"}, "properties": {"repobilityId": "996b295d560e04fa", "scanner": "scanner-primary", "fingerprint": "3896d89ec62ba061", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d51b09d77119bfbf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 generate_scenarios.js:72"}, "properties": {"repobilityId": "c258e521114850df", "scanner": "scanner-primary", "fingerprint": "d51b09d77119bfbf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ec9966b51bec0509", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test.js:7"}, "properties": {"repobilityId": "35311906c4a900ee", "scanner": "scanner-primary", "fingerprint": "ec9966b51bec0509", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f33af789c827093", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/test_pooler_5432.js:14"}, "properties": {"repobilityId": "5ee580699692877d", "scanner": "scanner-primary", "fingerprint": "3f33af789c827093", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8386e957b4a43dd6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/test_balance.js:23"}, "properties": {"repobilityId": "d25673c7c23eda5f", "scanner": "scanner-primary", "fingerprint": "8386e957b4a43dd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a054650d65c7b00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/trace_corrupted_run.js:18"}, "properties": {"repobilityId": "040ecff6801dc61a", "scanner": "scanner-primary", "fingerprint": "2a054650d65c7b00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4393b9064e296002", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/list_all_tables.js:19"}, "properties": {"repobilityId": "f508a49ef7b81b5d", "scanner": "scanner-primary", "fingerprint": "4393b9064e296002", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a23835dfd045ff2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/search_transcript_mcp.js:23"}, "properties": {"repobilityId": "87308bf7ed2476de", "scanner": "scanner-primary", "fingerprint": "0a23835dfd045ff2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-42bae6fca3532ba6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/list_accounts.js:7"}, "properties": {"repobilityId": "5b7114722f6c844d", "scanner": "scanner-primary", "fingerprint": "42bae6fca3532ba6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f26ee588fab5d1e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/reset.js:19"}, "properties": {"repobilityId": "e1566bbddd65c2b3", "scanner": "scanner-primary", "fingerprint": "f26ee588fab5d1e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f5d1acf372d41bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/test_pg.js:11"}, "properties": {"repobilityId": "71a6c7fcf6443b86", "scanner": "scanner-primary", "fingerprint": "3f5d1acf372d41bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e2ff5bc763429b3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/run-migration.js:13"}, "properties": {"repobilityId": "a0a43c5469716d7f", "scanner": "scanner-primary", "fingerprint": "7e2ff5bc763429b3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0bb13b0542ea2f8e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/search_transcript_full.js:21"}, "properties": {"repobilityId": "e82ba7b19ff90bee", "scanner": "scanner-primary", "fingerprint": "0bb13b0542ea2f8e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fdc8c94e87c187c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/search_transcript_prev_session.js:22"}, "properties": {"repobilityId": "74c861538bebde32", "scanner": "scanner-primary", "fingerprint": "fdc8c94e87c187c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e42f49372a926fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/recalculate_other_ledgers.ts:27"}, "properties": {"repobilityId": "f9dc2462a35fc93e", "scanner": "scanner-primary", "fingerprint": "3e42f49372a926fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-672bc6a5851ebbc4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/check.js:7"}, "properties": {"repobilityId": "8505be62da02a15b", "scanner": "scanner-primary", "fingerprint": "672bc6a5851ebbc4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac5fec0f5e87fd6f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/fix_ledger.js:45"}, "properties": {"repobilityId": "63231ae1d9a11d57", "scanner": "scanner-primary", "fingerprint": "ac5fec0f5e87fd6f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c3b60203a64b52d4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/read_log_history.js:22"}, "properties": {"repobilityId": "33fd7bf3c9630f5f", "scanner": "scanner-primary", "fingerprint": "c3b60203a64b52d4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1930214a1f71e94f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/inspect.js:33"}, "properties": {"repobilityId": "66fa630281d355eb", "scanner": "scanner-primary", "fingerprint": "1930214a1f71e94f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0fd4ef945b64be23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/fix.js:9"}, "properties": {"repobilityId": "1a88115577920958", "scanner": "scanner-primary", "fingerprint": "0fd4ef945b64be23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f1d8bf62a568e24b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/read_log.js:26"}, "properties": {"repobilityId": "7f6a7310a4ef39e1", "scanner": "scanner-primary", "fingerprint": "f1d8bf62a568e24b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d56826179d8f83c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/read_steps_120_140.js:21"}, "properties": {"repobilityId": "bc771f73a511c523", "scanner": "scanner-primary", "fingerprint": "d56826179d8f83c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ebead068f1dc2ddc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/run-new-migration.js:9"}, "properties": {"repobilityId": "57815095c7348ed7", "scanner": "scanner-primary", "fingerprint": "ebead068f1dc2ddc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c57e26795865545", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/query.js:16"}, "properties": {"repobilityId": "4d6b69a3c468f3db", "scanner": "scanner-primary", "fingerprint": "7c57e26795865545", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39a1331dc0df469c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/dump_entries.js:18"}, "properties": {"repobilityId": "903071c1fbe0003f", "scanner": "scanner-primary", "fingerprint": "39a1331dc0df469c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f34cdb78393ed685", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/read_all_history.js:21"}, "properties": {"repobilityId": "a72fb0acb53f500d", "scanner": "scanner-primary", "fingerprint": "f34cdb78393ed685", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9f172cb50dd40e28", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/api/index.ts:7"}, "properties": {"repobilityId": "20e43def35534388", "scanner": "scanner-primary", "fingerprint": "9f172cb50dd40e28", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-794d21ba6a3dbcc0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/supabase/functions/run-migration/index.ts:8"}, "properties": {"repobilityId": "b91c4cc022093c17", "scanner": "scanner-primary", "fingerprint": "794d21ba6a3dbcc0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5dfcbd6f2c8b52ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/delete_user.ts:20"}, "properties": {"repobilityId": "e1dc49554aba8ce7", "scanner": "scanner-primary", "fingerprint": "5dfcbd6f2c8b52ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39dc79ddb5739552", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:11"}, "properties": {"repobilityId": "a178156af585d748", "scanner": "scanner-primary", "fingerprint": "39dc79ddb5739552", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-932da961661faa94", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/test_edge_cases.ts:24"}, "properties": {"repobilityId": "7df79ca690362541", "scanner": "scanner-primary", "fingerprint": "932da961661faa94", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb3c503289e0f2d8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/inspect_req_2.ts:4"}, "properties": {"repobilityId": "213d699b5755a1dd", "scanner": "scanner-primary", "fingerprint": "bb3c503289e0f2d8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-712e9dd11920a1de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/repair_stuck_requisitions.ts:19"}, "properties": {"repobilityId": "061ce2ee6d96d883", "scanner": "scanner-primary", "fingerprint": "712e9dd11920a1de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6a5d89d774f2e44", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/check_lenco_status.ts:14"}, "properties": {"repobilityId": "99eeeb76a8faf944", "scanner": "scanner-primary", "fingerprint": "e6a5d89d774f2e44", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-040c0de30ee39218", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/wipeout_research.ts:10"}, "properties": {"repobilityId": "05513f4c468cf533", "scanner": "scanner-primary", "fingerprint": "040c0de30ee39218", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-715c2605ab77c043", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/middleware/auth.ts:9"}, "properties": {"repobilityId": "e31d49820b9744ea", "scanner": "scanner-primary", "fingerprint": "715c2605ab77c043", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-669caabf842eda55", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/fix_dates_and_recalculate.ts:19"}, "properties": {"repobilityId": "08a083ea7ecb4816", "scanner": "scanner-primary", "fingerprint": "669caabf842eda55", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-462df0fcfe7c08bc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/reconcile_wallet_ledger.ts:30"}, "properties": {"repobilityId": "d711aaa8e4cc92d4", "scanner": "scanner-primary", "fingerprint": "462df0fcfe7c08bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09dc3d87386fe031", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/lenco_source_of_truth_reconcile.ts:64"}, "properties": {"repobilityId": "ad1b392c61047123", "scanner": "scanner-primary", "fingerprint": "09dc3d87386fe031", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6f8e070f2e0a3c45", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/test_payroll_disbursal.ts:13"}, "properties": {"repobilityId": "828964b13439fa23", "scanner": "scanner-primary", "fingerprint": "6f8e070f2e0a3c45", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c24c19d3a1be8d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/reconcile_amatoasts_day.ts:58"}, "properties": {"repobilityId": "461288b5225f62c2", "scanner": "scanner-primary", "fingerprint": "7c24c19d3a1be8d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a9f872e16acf7796", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/diagnose_ledger.ts:15"}, "properties": {"repobilityId": "a6c813bb51545e30", "scanner": "scanner-primary", "fingerprint": "a9f872e16acf7796", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-062ffd869c6dacfd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/debug-qb.ts:11"}, "properties": {"repobilityId": "18078cac038ffe11", "scanner": "scanner-primary", "fingerprint": "062ffd869c6dacfd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc373565ae2c6e97", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/repair_missing_ledger_entries.ts:31"}, "properties": {"repobilityId": "8d90349844a9669f", "scanner": "scanner-primary", "fingerprint": "bc373565ae2c6e97", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a0c3c8f96551ee9f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/sweep_stranded_commissions.ts:51"}, "properties": {"repobilityId": "9bc2930619a0696a", "scanner": "scanner-primary", "fingerprint": "a0c3c8f96551ee9f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bd5de6e72fc13331", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/add_external_reference.ts:4"}, "properties": {"repobilityId": "fa05540e59b19479", "scanner": "scanner-primary", "fingerprint": "bd5de6e72fc13331", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce950aa16a8bf814", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/check-lenco-balance.ts:12"}, "properties": {"repobilityId": "4962217387f7e4d6", "scanner": "scanner-primary", "fingerprint": "ce950aa16a8bf814", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5fa214b2f2d10653", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/supabase.ts:9"}, "properties": {"repobilityId": "df98dd50c465bc66", "scanner": "scanner-primary", "fingerprint": "5fa214b2f2d10653", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c601a6209fcad984", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/accounting.controller.ts:104"}, "properties": {"repobilityId": "3e56e6799170593e", "scanner": "scanner-primary", "fingerprint": "c601a6209fcad984", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-210954ef2359f330", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/organization.controller.ts:114"}, "properties": {"repobilityId": "c0dce357601ed1fb", "scanner": "scanner-primary", "fingerprint": "210954ef2359f330", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d04589d63f61333", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/disbursement.controller.ts:121"}, "properties": {"repobilityId": "ebbf2ac1b26b8e0d", "scanner": "scanner-primary", "fingerprint": "4d04589d63f61333", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f2b8f4a9da94c1ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/requisition.controller.ts:292"}, "properties": {"repobilityId": "d5ad35bc98485b6c", "scanner": "scanner-primary", "fingerprint": "f2b8f4a9da94c1ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3c3151da7798ab81", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/auth.controller.ts:90"}, "properties": {"repobilityId": "3217572b41e5f66e", "scanner": "scanner-primary", "fingerprint": "3c3151da7798ab81", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dc04362e9a6e2539", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/lenco.webhook.controller.ts:37"}, "properties": {"repobilityId": "434c7ab253515069", "scanner": "scanner-primary", "fingerprint": "dc04362e9a6e2539", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e648cf35fc1302f7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/lenco.controller.ts:33"}, "properties": {"repobilityId": "f916c0c54c664993", "scanner": "scanner-primary", "fingerprint": "e648cf35fc1302f7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9425a0a349a01fbe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/user.controller.ts:156"}, "properties": {"repobilityId": "52c88f76e0ec8c7a", "scanner": "scanner-primary", "fingerprint": "9425a0a349a01fbe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0feedbdc3413132", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/cashbook.controller.ts:351"}, "properties": {"repobilityId": "c66029cfb3181c38", "scanner": "scanner-primary", "fingerprint": "e0feedbdc3413132", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-73bebeb38eb509d4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/ai.controller.ts:102"}, "properties": {"repobilityId": "7e31cb97dea1b627", "scanner": "scanner-primary", "fingerprint": "73bebeb38eb509d4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-311b17780c47373d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/controllers/account.controller.ts:17"}, "properties": {"repobilityId": "9617bb3c74e3bf41", "scanner": "scanner-primary", "fingerprint": "311b17780c47373d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f501f75f013cf8f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/audit.service.ts:15"}, "properties": {"repobilityId": "5804887298ae25e5", "scanner": "scanner-primary", "fingerprint": "7f501f75f013cf8f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-827a48f841712ceb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/cashbook.service.ts:79"}, "properties": {"repobilityId": "08e901e15691c25b", "scanner": "scanner-primary", "fingerprint": "827a48f841712ceb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-380aff1901af8856", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/email.service.ts:126"}, "properties": {"repobilityId": "76bb8787d905eced", "scanner": "scanner-primary", "fingerprint": "380aff1901af8856", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1eb9fb3340186145", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/quickbooks.service.ts:22"}, "properties": {"repobilityId": "cc7879b6c9752fc2", "scanner": "scanner-primary", "fingerprint": "1eb9fb3340186145", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba77f5fb0f5a8359", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/requisition_message.service.ts:48"}, "properties": {"repobilityId": "331178e49c121727", "scanner": "scanner-primary", "fingerprint": "ba77f5fb0f5a8359", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68e1c96381b51876", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/learning.validator.ts:26"}, "properties": {"repobilityId": "76ccd7e3e4efcd84", "scanner": "scanner-primary", "fingerprint": "68e1c96381b51876", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7b5f7e959f306df8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/rule.engine.ts:44"}, "properties": {"repobilityId": "e2ef5ab379c78437", "scanner": "scanner-primary", "fingerprint": "7b5f7e959f306df8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6969d008da34620d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/memory.service.ts:15"}, "properties": {"repobilityId": "a4ec1d56b138829f", "scanner": "scanner-primary", "fingerprint": "6969d008da34620d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-99b80c1b28f4315c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/ai.service.ts:25"}, "properties": {"repobilityId": "1441db1e47b82147", "scanner": "scanner-primary", "fingerprint": "99b80c1b28f4315c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5ca9e4df57e1246", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/ocr.service.ts:109"}, "properties": {"repobilityId": "0783e5617990f656", "scanner": "scanner-primary", "fingerprint": "f5ca9e4df57e1246", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c83af7e38752f7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/ai/decision.router.ts:21"}, "properties": {"repobilityId": "6a507d95942ccc91", "scanner": "scanner-primary", "fingerprint": "2c83af7e38752f7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e11633e5612d094", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/index.ts:9"}, "properties": {"repobilityId": "26691fa30cf7578e", "scanner": "scanner-primary", "fingerprint": "3e11633e5612d094", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-edbf04fe86cb7a80", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/migrate.ts:10"}, "properties": {"repobilityId": "4c947c823da5fa9d", "scanner": "scanner-primary", "fingerprint": "edbf04fe86cb7a80", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-669009c55c677105", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/migrate-fix.js:22"}, "properties": {"repobilityId": "ef25953b9711ccbb", "scanner": "scanner-primary", "fingerprint": "669009c55c677105", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ab52781ce71927d5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/migrate-update.ts:10"}, "properties": {"repobilityId": "0b1a092efe883d7a", "scanner": "scanner-primary", "fingerprint": "ab52781ce71927d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb0f48b75cc18a97", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/DisbursementDetailOverlay.tsx:309"}, "properties": {"repobilityId": "1c759d8bb568142b", "scanner": "scanner-primary", "fingerprint": "fb0f48b75cc18a97", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60329bb6f6419fea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/CashInflowModal.tsx:149"}, "properties": {"repobilityId": "3031232c99be28f2", "scanner": "scanner-primary", "fingerprint": "60329bb6f6419fea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e4c0fcaf86a8305", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/PWAInstallPrompt.tsx:30"}, "properties": {"repobilityId": "0d17c9d71f9fa630", "scanner": "scanner-primary", "fingerprint": "2e4c0fcaf86a8305", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9494bdb23ab07ac2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/Layout.tsx:117"}, "properties": {"repobilityId": "df96fed43bdaa96d", "scanner": "scanner-primary", "fingerprint": "9494bdb23ab07ac2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac792bf02d98d1e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/TopNavbar.tsx:119"}, "properties": {"repobilityId": "fd032fa88c54ff21", "scanner": "scanner-primary", "fingerprint": "ac792bf02d98d1e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-646f3736f652191f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/settings/ChartOfAccounts.tsx:159"}, "properties": {"repobilityId": "0fcfbb1cd7d83d5f", "scanner": "scanner-primary", "fingerprint": "646f3736f652191f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b944df208a4f2f9c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/settings/ProductSettings.tsx:286"}, "properties": {"repobilityId": "4dc7a392ba923572", "scanner": "scanner-primary", "fingerprint": "b944df208a4f2f9c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1037fe51494cfd0d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/accounting/AccountingModal.tsx:109"}, "properties": {"repobilityId": "9bf76dc85b6956e9", "scanner": "scanner-primary", "fingerprint": "1037fe51494cfd0d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dc66988d94b61615", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/requisitions/RequisitionMessageCard.tsx:861"}, "properties": {"repobilityId": "cee5415ef4cce123", "scanner": "scanner-primary", "fingerprint": "dc66988d94b61615", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f7d19dbeb6216bd1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/requisitions/RequisitionAttachments.tsx:195"}, "properties": {"repobilityId": "a397201ea84512a8", "scanner": "scanner-primary", "fingerprint": "f7d19dbeb6216bd1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ef2b7154fbcc8ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/requisitions/MobilePayrollWizard.tsx:678"}, "properties": {"repobilityId": "771a8e00ad9d9a15", "scanner": "scanner-primary", "fingerprint": "0ef2b7154fbcc8ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4d73c2cd2f869a5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/components/requisitions/RequisitionDocumentTemplates.tsx:158"}, "properties": {"repobilityId": "7172c1a47a3817f0", "scanner": "scanner-primary", "fingerprint": "b4d73c2cd2f869a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b8b4e6731f89006b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/api.ts:6"}, "properties": {"repobilityId": "dec72cdca5f1949f", "scanner": "scanner-primary", "fingerprint": "b8b4e6731f89006b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb32f98bd4885336", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Reporting.tsx:1060"}, "properties": {"repobilityId": "fd2a12f7d7d1ecd0", "scanner": "scanner-primary", "fingerprint": "eb32f98bd4885336", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23db930ea43526c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Vouchers.tsx:131"}, "properties": {"repobilityId": "5d72bead49a78cca", "scanner": "scanner-primary", "fingerprint": "23db930ea43526c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fdde3a2964849761", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Menu.tsx:94"}, "properties": {"repobilityId": "350a562519f10a1d", "scanner": "scanner-primary", "fingerprint": "fdde3a2964849761", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-423993f3e9f2eccd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/PublicPay.tsx:743"}, "properties": {"repobilityId": "e89271b9f3ebbc71", "scanner": "scanner-primary", "fingerprint": "423993f3e9f2eccd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e2cad8c189deaee0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/pages/PublicPay.tsx:224"}, "properties": {"repobilityId": "f87be1dd6ba564db", "scanner": "scanner-primary", "fingerprint": "e2cad8c189deaee0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77868a4f9c1d93cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/CashierDashboard.tsx:517"}, "properties": {"repobilityId": "d951e647dcb6fa48", "scanner": "scanner-primary", "fingerprint": "77868a4f9c1d93cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d9f286bdac8066a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/pages/CashierDashboard.tsx:124"}, "properties": {"repobilityId": "ea9691e04075b004", "scanner": "scanner-primary", "fingerprint": "1d9f286bdac8066a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2e618c0cb72d95b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Login.tsx:382"}, "properties": {"repobilityId": "95fedc3806d43a6d", "scanner": "scanner-primary", "fingerprint": "d2e618c0cb72d95b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1eec68217676324b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Settings.tsx:486"}, "properties": {"repobilityId": "587960728f2af1c5", "scanner": "scanner-primary", "fingerprint": "1eec68217676324b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33f23223168b9552", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/pages/Settings.tsx:158"}, "properties": {"repobilityId": "09a627445216d1a8", "scanner": "scanner-primary", "fingerprint": "33f23223168b9552", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f01efb03dd55ce53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/Audit.tsx:151"}, "properties": {"repobilityId": "c6fa6e30886a0211", "scanner": "scanner-primary", "fingerprint": "f01efb03dd55ce53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d86bea4f787e786e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/repair_stuck_requisitions.ts:19"}, "properties": {"repobilityId": "1b12e80c1bb67785", "scanner": "scanner-primary", "fingerprint": "d86bea4f787e786e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-598ea602c4a8d798", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/run-migration/index.ts:14"}, "properties": {"repobilityId": "ae2b77eae99e2595", "scanner": "scanner-primary", "fingerprint": "598ea602c4a8d798", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f838eb775b7a5b67", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/sync-lenco-transactions/index.ts:17"}, "properties": {"repobilityId": "9840d11f706c86d4", "scanner": "scanner-primary", "fingerprint": "f838eb775b7a5b67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2720d50597bd234", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in apps/api/src/index.ts:316"}, "properties": {"repobilityId": "3ca37d88226c999f", "scanner": "scanner-primary", "fingerprint": "d2720d50597bd234", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/index.ts"}, "region": {"startLine": 316}}}]}, {"ruleId": "scanner-0af5814e217ca789", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/classify-requisition/index.ts:6"}, "properties": {"repobilityId": "55c9952f09dab98e", "scanner": "scanner-primary", "fingerprint": "0af5814e217ca789", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/classify-requisition/index.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-bfa807263b0cea57", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/sync-lenco-transactions/index.ts:4"}, "properties": {"repobilityId": "42017d9ccc2d6321", "scanner": "scanner-primary", "fingerprint": "bfa807263b0cea57", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/sync-lenco-transactions/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-1834f70debc61d50", "level": "note", "message": {"text": "Very large file: apps/api/src/controllers/disbursement.controller.ts (1592 lines)"}, "properties": {"repobilityId": "88eb8290257f97fe", "scanner": "scanner-primary", "fingerprint": "1834f70debc61d50", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f110afcfb2543faa", "level": "note", "message": {"text": "Very large file: apps/api/src/controllers/requisition.controller.ts (2564 lines)"}, "properties": {"repobilityId": "8dd6ea6ccf493719", "scanner": "scanner-primary", "fingerprint": "f110afcfb2543faa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ab88936712bfe784", "level": "note", "message": {"text": "Very large file: apps/api/src/controllers/lenco.controller.ts (1739 lines)"}, "properties": {"repobilityId": "08e9e51ca3e23d82", "scanner": "scanner-primary", "fingerprint": "ab88936712bfe784", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6bc7b750ce3b74e0", "level": "note", "message": {"text": "Very large file: apps/web/src/components/requisitions/RequisitionMessageCard.tsx (3392 lines)"}, "properties": {"repobilityId": "ec8555c730112a03", "scanner": "scanner-primary", "fingerprint": "6bc7b750ce3b74e0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-46db2bf0ac915d6a", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/Reporting.tsx (2116 lines)"}, "properties": {"repobilityId": "f0a5f6911a87f777", "scanner": "scanner-primary", "fingerprint": "46db2bf0ac915d6a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f948b74fc8108e1d", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/RequisitionCreate.tsx (1115 lines)"}, "properties": {"repobilityId": "4eecd53d66105987", "scanner": "scanner-primary", "fingerprint": "f948b74fc8108e1d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9672428b35c707a9", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/PublicPay.tsx (1146 lines)"}, "properties": {"repobilityId": "079b4e87a90fbd71", "scanner": "scanner-primary", "fingerprint": "9672428b35c707a9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a663ac21b31f7c4b", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/CashierDashboard.tsx (1012 lines)"}, "properties": {"repobilityId": "40b0a8489810d97a", "scanner": "scanner-primary", "fingerprint": "a663ac21b31f7c4b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2e15b8f1d0d0c998", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/CashLedger.tsx (2634 lines)"}, "properties": {"repobilityId": "aff549142ae67b15", "scanner": "scanner-primary", "fingerprint": "2e15b8f1d0d0c998", "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-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"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-2699d5f16ae11282", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "properties": {"repobilityId": "37ac218a4ef9b430", "scanner": "scanner-primary", "fingerprint": "2699d5f16ae11282", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "5ee7900bdc5fbcae", "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": "b6dfa8a9f2f84edf", "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": "29c9bf12d4b1f317", "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": "678107bbc661041f", "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": "ac94aef6779e3823", "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": "9495a5dfadf47efd", "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": "057702a36e83d5b7", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-c9ba995ccbb9eede", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/debug-qb.ts:46"}, "properties": {"repobilityId": "c30c6d7923d1d8c6", "scanner": "scanner-primary", "fingerprint": "c9ba995ccbb9eede", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-855bcb355532736d", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/controllers/requisition.controller.ts:1167"}, "properties": {"repobilityId": "0a187c37d6c6dcb2", "scanner": "scanner-primary", "fingerprint": "855bcb355532736d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd6c3381b90b9dae", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/controllers/requisition.controller.ts:430"}, "properties": {"repobilityId": "b6c69fa9f67431c3", "scanner": "scanner-primary", "fingerprint": "bd6c3381b90b9dae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-63f9e866234e7ce8", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/controllers/lenco.controller.ts:1092"}, "properties": {"repobilityId": "2c43b0916ed514b6", "scanner": "scanner-primary", "fingerprint": "63f9e866234e7ce8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d715cafd43824be3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/controllers/ai.controller.ts:73"}, "properties": {"repobilityId": "bc323e6c3fc507a8", "scanner": "scanner-primary", "fingerprint": "d715cafd43824be3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a0055825bd7292c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/services/cashbook.service.ts:626"}, "properties": {"repobilityId": "0a17144aaf9dfad8", "scanner": "scanner-primary", "fingerprint": "1a0055825bd7292c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f45bee72a2785ad9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/quickbooks.service.ts:39"}, "properties": {"repobilityId": "0d01438e444fbe74", "scanner": "scanner-primary", "fingerprint": "f45bee72a2785ad9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7096a4e143e7b5a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/ai/ai.service.ts:177"}, "properties": {"repobilityId": "9ddf650a5c1069f5", "scanner": "scanner-primary", "fingerprint": "7096a4e143e7b5a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-57767a1a41560092", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/ai/ocr.service.ts:142"}, "properties": {"repobilityId": "9d6065d69b8393ec", "scanner": "scanner-primary", "fingerprint": "57767a1a41560092", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd2c43e95e39bdfb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/api.ts:32"}, "properties": {"repobilityId": "855d37ec4e17ff49", "scanner": "scanner-primary", "fingerprint": "fd2c43e95e39bdfb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37f42960383d5a55", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/Join.tsx:60"}, "properties": {"repobilityId": "8db8fd2c726c15d4", "scanner": "scanner-primary", "fingerprint": "37f42960383d5a55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0376ec7974a19776", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/pages/CashierDashboard.tsx:380"}, "properties": {"repobilityId": "52750281b5760184", "scanner": "scanner-primary", "fingerprint": "0376ec7974a19776", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f8916b802db6624", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/account.service.ts:22"}, "properties": {"repobilityId": "3dffe6b4022a59ef", "scanner": "scanner-primary", "fingerprint": "0f8916b802db6624", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3fa67b10b6c15b1c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/budget.service.ts:27"}, "properties": {"repobilityId": "7eadce90ce36c7f1", "scanner": "scanner-primary", "fingerprint": "3fa67b10b6c15b1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-849f6c88e5e4ba55", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/lenco.service.ts:10"}, "properties": {"repobilityId": "c58f2cefdc7646d8", "scanner": "scanner-primary", "fingerprint": "849f6c88e5e4ba55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d4205782870976c6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/report.service.ts:34"}, "properties": {"repobilityId": "031c8a97865b2e18", "scanner": "scanner-primary", "fingerprint": "d4205782870976c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-250ca965ffc4afbb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/user.service.ts:21"}, "properties": {"repobilityId": "7af281532fd9d206", "scanner": "scanner-primary", "fingerprint": "250ca965ffc4afbb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-24b6021966392e62", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/integration.service.ts:16"}, "properties": {"repobilityId": "fa88cc0e997c7888", "scanner": "scanner-primary", "fingerprint": "24b6021966392e62", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b930587a8c5266c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/voucher.service.ts:41"}, "properties": {"repobilityId": "6e6389d15c4b58d2", "scanner": "scanner-primary", "fingerprint": "b930587a8c5266c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-562cd07709e679ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/context/AuthContext.tsx:56"}, "properties": {"repobilityId": "17344d01fa41a28e", "scanner": "scanner-primary", "fingerprint": "562cd07709e679ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-59c9b791de698a05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/sync-lenco-transactions/index.ts:19"}, "properties": {"repobilityId": "9a131853a04d1cb5", "scanner": "scanner-primary", "fingerprint": "59c9b791de698a05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d6ffa20a9f1093b", "level": "note", "message": {"text": "24 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "880bbf29bf1f87e1", "scanner": "scanner-primary", "fingerprint": "2d6ffa20a9f1093b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-523d0a4fa1ae98e1", "level": "warning", "message": {"text": "Frontend route `/join` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "1c8df3fab2163fbf", "scanner": "scanner-primary", "fingerprint": "523d0a4fa1ae98e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-70ff7629e52bda11", "level": "warning", "message": {"text": "Frontend route `/disconnect` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "6bd29fbb09c72375", "scanner": "scanner-primary", "fingerprint": "70ff7629e52bda11", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3cd351ea4a9f8b62", "level": "warning", "message": {"text": "Frontend route `/pay/:wallet_id` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "4b9e84067897b731", "scanner": "scanner-primary", "fingerprint": "3cd351ea4a9f8b62", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6796e326bb745fbf", "level": "warning", "message": {"text": "Frontend route `/vouchers/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "4d766850a11ca458", "scanner": "scanner-primary", "fingerprint": "6796e326bb745fbf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d055e571d48f2afc", "level": "error", "message": {"text": "Dangling fetch: POST https://api.supabase.com/v1/projects/${PROJECT_REF}/database/query (apps/api/run-new-migration.js:15)"}, "properties": {"repobilityId": "400586de9334ff5b", "scanner": "scanner-primary", "fingerprint": "d055e571d48f2afc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-15816bc0580e42ec", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/services/ai/ai.service.ts:177)"}, "properties": {"repobilityId": "30fb7737ecda7e4d", "scanner": "scanner-primary", "fingerprint": "15816bc0580e42ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da8b09cd9ead4660", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (apps/api/src/services/ai/embedding.service.ts:25)"}, "properties": {"repobilityId": "602e860db72249fb", "scanner": "scanner-primary", "fingerprint": "da8b09cd9ead4660", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a47d130e373e385b", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (supabase/functions/classify-requisition/index.ts:152)"}, "properties": {"repobilityId": "4fe2d3edc7564672", "scanner": "scanner-primary", "fingerprint": "a47d130e373e385b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b28d92215a503990", "level": "note", "message": {"text": "Unused endpoint: USE /auth"}, "properties": {"repobilityId": "adb097e4ee82f3d6", "scanner": "scanner-primary", "fingerprint": "b28d92215a503990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e286e13f14d94bb", "level": "note", "message": {"text": "Unused endpoint: USE /requisitions"}, "properties": {"repobilityId": "7306c31531a30c3e", "scanner": "scanner-primary", "fingerprint": "7e286e13f14d94bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba095fbd2fa5f4fa", "level": "note", "message": {"text": "Unused endpoint: USE /accounts"}, "properties": {"repobilityId": "c1c863319be532d0", "scanner": "scanner-primary", "fingerprint": "ba095fbd2fa5f4fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce730065f0ff3157", "level": "note", "message": {"text": "Unused endpoint: USE /vouchers"}, "properties": {"repobilityId": "706a6a5a704513b3", "scanner": "scanner-primary", "fingerprint": "ce730065f0ff3157", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3c3d755b27c944d", "level": "note", "message": {"text": "Unused endpoint: USE /cashbook"}, "properties": {"repobilityId": "b1369eb8272a85b4", "scanner": "scanner-primary", "fingerprint": "f3c3d755b27c944d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd458eb13d1de46b", "level": "note", "message": {"text": "Unused endpoint: USE /integrations"}, "properties": {"repobilityId": "af197be385db8430", "scanner": "scanner-primary", "fingerprint": "fd458eb13d1de46b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e480cf1bc736555", "level": "note", "message": {"text": "Unused endpoint: USE /users"}, "properties": {"repobilityId": "14f3c3ad388c532e", "scanner": "scanner-primary", "fingerprint": "4e480cf1bc736555", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6bdcbf2073dfa768", "level": "note", "message": {"text": "Unused endpoint: USE /ai"}, "properties": {"repobilityId": "781acfa026f1ea9b", "scanner": "scanner-primary", "fingerprint": "6bdcbf2073dfa768", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77f68a230eae1580", "level": "note", "message": {"text": "Unused endpoint: USE /organizations"}, "properties": {"repobilityId": "18768bcfbdd048cf", "scanner": "scanner-primary", "fingerprint": "77f68a230eae1580", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bae325190cb2c337", "level": "note", "message": {"text": "Unused endpoint: USE /organizations/products"}, "properties": {"repobilityId": "8071e86948412076", "scanner": "scanner-primary", "fingerprint": "bae325190cb2c337", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b4bf921f3e5cc45", "level": "note", "message": {"text": "Unused endpoint: USE /budgets"}, "properties": {"repobilityId": "0d2dfad82b5c8230", "scanner": "scanner-primary", "fingerprint": "9b4bf921f3e5cc45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a8f40a426fdfb45", "level": "note", "message": {"text": "Unused endpoint: USE /reports"}, "properties": {"repobilityId": "b174604cf13d34bd", "scanner": "scanner-primary", "fingerprint": "7a8f40a426fdfb45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44a5043c29ec91aa", "level": "note", "message": {"text": "Unused endpoint: USE /lenco"}, "properties": {"repobilityId": "fb77a92238b936a4", "scanner": "scanner-primary", "fingerprint": "44a5043c29ec91aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "c6e42631df98c44d", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "2b67ecf03bc281c9", "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": "0cef1d90b55fa0f6", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e216611c1ac8b843", "level": "note", "message": {"text": "Unused endpoint: POST /:id/post"}, "properties": {"repobilityId": "3d0e9a0bccc72058", "scanner": "scanner-primary", "fingerprint": "e216611c1ac8b843", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "a37a0d9d358f7bcb", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d16b1bb2723f51e", "level": "note", "message": {"text": "Unused endpoint: POST /signup"}, "properties": {"repobilityId": "71252733d6aab9cc", "scanner": "scanner-primary", "fingerprint": "8d16b1bb2723f51e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11b11f92b74f3208", "level": "note", "message": {"text": "Unused endpoint: POST /resolve-username"}, "properties": {"repobilityId": "b8b346ab519f3896", "scanner": "scanner-primary", "fingerprint": "11b11f92b74f3208", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e4b1308838798a52", "level": "note", "message": {"text": "Unused endpoint: GET /organizations/search"}, "properties": {"repobilityId": "8a3c1cc63a9b428b", "scanner": "scanner-primary", "fingerprint": "e4b1308838798a52", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f32ff565587ae0ff", "level": "note", "message": {"text": "Unused endpoint: POST /join-request"}, "properties": {"repobilityId": "5d7ac6c4d3ab8557", "scanner": "scanner-primary", "fingerprint": "f32ff565587ae0ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffb7610bb9cde0ae", "level": "note", "message": {"text": "Unused endpoint: POST /complete-invitation"}, "properties": {"repobilityId": "8d090292974788ad", "scanner": "scanner-primary", "fingerprint": "ffb7610bb9cde0ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8f413679e3ff80b1", "level": "note", "message": {"text": "Unused endpoint: GET /my-organizations"}, "properties": {"repobilityId": "c2f6ef2ea927ce12", "scanner": "scanner-primary", "fingerprint": "8f413679e3ff80b1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3bd75b5fdc09c316", "level": "note", "message": {"text": "Unused endpoint: POST /switch-organization"}, "properties": {"repobilityId": "f401193d7743ccf1", "scanner": "scanner-primary", "fingerprint": "3bd75b5fdc09c316", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be4cb5e3cabcce80", "level": "note", "message": {"text": "Unused endpoint: POST /import"}, "properties": {"repobilityId": "f0135bf517defcfe", "scanner": "scanner-primary", "fingerprint": "be4cb5e3cabcce80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27cc2bb73ad635b3", "level": "note", "message": {"text": "Unused endpoint: POST /suggest"}, "properties": {"repobilityId": "56ea538b84026288", "scanner": "scanner-primary", "fingerprint": "27cc2bb73ad635b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d5b2b188d08ca82", "level": "note", "message": {"text": "Unused endpoint: PUT /:id"}, "properties": {"repobilityId": "8a37232b4951b8e4", "scanner": "scanner-primary", "fingerprint": "8d5b2b188d08ca82", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67d28fa8cd6bb12f", "level": "note", "message": {"text": "Unused endpoint: PUT /"}, "properties": {"repobilityId": "53c930882e136acc", "scanner": "scanner-primary", "fingerprint": "67d28fa8cd6bb12f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b30f4c0994a30b4", "level": "note", "message": {"text": "Unused endpoint: DELETE /"}, "properties": {"repobilityId": "427d45d8b2bdeb5f", "scanner": "scanner-primary", "fingerprint": "3b30f4c0994a30b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b63da4853e3e9d15", "level": "note", "message": {"text": "Unused endpoint: GET /admin/all"}, "properties": {"repobilityId": "cd24f88a1a8706f4", "scanner": "scanner-primary", "fingerprint": "b63da4853e3e9d15", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f39249a345a19765", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/status"}, "properties": {"repobilityId": "66977d0260bf3a87", "scanner": "scanner-primary", "fingerprint": "f39249a345a19765", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b7e649f61cd2b2c2", "level": "note", "message": {"text": "Unused endpoint: POST /:id/revert-to-draft"}, "properties": {"repobilityId": "f8be72119d601b81", "scanner": "scanner-primary", "fingerprint": "b7e649f61cd2b2c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37240bfd6a9852a7", "level": "note", "message": {"text": "Unused endpoint: GET /reports/audit"}, "properties": {"repobilityId": "e0aa558b5ceb8834", "scanner": "scanner-primary", "fingerprint": "37240bfd6a9852a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a02373eb965ad909", "level": "note", "message": {"text": "Unused endpoint: POST /maintenance/backfill-audit"}, "properties": {"repobilityId": "50c7b15c48b1f8fc", "scanner": "scanner-primary", "fingerprint": "a02373eb965ad909", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c573e386622141fa", "level": "note", "message": {"text": "Unused endpoint: GET /disbursements/history"}, "properties": {"repobilityId": "bb9e60c890b91d3f", "scanner": "scanner-primary", "fingerprint": "c573e386622141fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7161913886771dde", "level": "note", "message": {"text": "Unused endpoint: POST /:id/disburse"}, "properties": {"repobilityId": "2ae432c9ac3813bd", "scanner": "scanner-primary", "fingerprint": "7161913886771dde", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f43bfc193eff785d", "level": "note", "message": {"text": "Unused endpoint: POST /:id/disburse-payroll"}, "properties": {"repobilityId": "0678ca1626bdb965", "scanner": "scanner-primary", "fingerprint": "f43bfc193eff785d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a50a6c6cda885fd4", "level": "note", "message": {"text": "Unused endpoint: POST /:id/disburse-excess"}, "properties": {"repobilityId": "873ac711762cbe02", "scanner": "scanner-primary", "fingerprint": "a50a6c6cda885fd4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-82ec66a297b45e6f", "level": "note", "message": {"text": "Unused endpoint: POST /:id/acknowledge"}, "properties": {"repobilityId": "be9367c8557d893e", "scanner": "scanner-primary", "fingerprint": "82ec66a297b45e6f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a1ef057b0ac510e", "level": "note", "message": {"text": "Unused endpoint: PATCH /disbursements/:id"}, "properties": {"repobilityId": "eb893fb9e0b4afff", "scanner": "scanner-primary", "fingerprint": "2a1ef057b0ac510e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3df7325c0b2f1277", "level": "note", "message": {"text": "Unused endpoint: POST /disbursements/:id/analyze-proof"}, "properties": {"repobilityId": "f90a03ce0acb14b7", "scanner": "scanner-primary", "fingerprint": "3df7325c0b2f1277", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f26cd1e2155ecbb7", "level": "note", "message": {"text": "Unused endpoint: GET /:id/verify-disbursement"}, "properties": {"repobilityId": "da795d147fa8a3dd", "scanner": "scanner-primary", "fingerprint": "f26cd1e2155ecbb7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa5c6b5b2f384fa0", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/expenses"}, "properties": {"repobilityId": "0803769ebc432590", "scanner": "scanner-primary", "fingerprint": "aa5c6b5b2f384fa0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c21abb6a92ac1da9", "level": "note", "message": {"text": "Unused endpoint: POST /:id/scan-receipts"}, "properties": {"repobilityId": "c1658c1614a2db68", "scanner": "scanner-primary", "fingerprint": "c21abb6a92ac1da9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4971f38c134754e4", "level": "note", "message": {"text": "Unused endpoint: POST /:id/items/:itemId/analyze-receipt"}, "properties": {"repobilityId": "e6ac424106aaa4cf", "scanner": "scanner-primary", "fingerprint": "4971f38c134754e4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00c1271e9d7e4494", "level": "note", "message": {"text": "Unused endpoint: POST /:id/submit-change"}, "properties": {"repobilityId": "a075e80bef88467b", "scanner": "scanner-primary", "fingerprint": "00c1271e9d7e4494", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-feedf5be663d9224", "level": "note", "message": {"text": "Unused endpoint: POST /:id/confirm-change"}, "properties": {"repobilityId": "a0ecec67a0cf4b3d", "scanner": "scanner-primary", "fingerprint": "feedf5be663d9224", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67ef32b1514f1895", "level": "note", "message": {"text": "Unused endpoint: POST /:id/post-voucher"}, "properties": {"repobilityId": "c2ea0922ae056467", "scanner": "scanner-primary", "fingerprint": "67ef32b1514f1895", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9bd5300f2cbb3465", "level": "note", "message": {"text": "Unused endpoint: POST /:id/approve-categorization"}, "properties": {"repobilityId": "0fe6143b3b91a107", "scanner": "scanner-primary", "fingerprint": "9bd5300f2cbb3465", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}