{"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-a9bc2077187e3ca2", "name": "Stray `console.log` in TS/JS \u2014 tests/my-schedule-routing.test.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/my-schedule-routing.test.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-3921f16a5d22c83f", "name": "Stray `console.log` in TS/JS \u2014 tests/recurring-booking.test.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/recurring-booking.test.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f0f67c2b1c812148", "name": "Stray `console.log` in TS/JS \u2014 tests/public-api.test.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/public-api.test.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-25f7e7f4ebe2589f", "name": "Stray `console.log` in TS/JS \u2014 tests/discount-group.test.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-group.test.js: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-a078277275b67875", "name": "Stray `console.log` in TS/JS \u2014 tests/google-auth.test.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/google-auth.test.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1425b1ff1d28e742", "name": "Stray `console.log` in TS/JS \u2014 tests/booking-payment.test.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-payment.test.js:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ba30b965eec2120", "name": "Stray `console.log` in TS/JS \u2014 tests/my-schedule-service.test.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/my-schedule-service.test.js:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd0ea227b2c3ebab", "name": "Stray `console.log` in TS/JS \u2014 tests/admin-backfill-api.test.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-backfill-api.test.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2373e234e9a0c992", "name": "Stray `console.log` in TS/JS \u2014 tests/course-price.test.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/course-price.test.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ca60808c5ad06c7", "name": "Stray `console.log` in TS/JS \u2014 tests/lineClient.test.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/lineClient.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-de58074a79625fa2", "name": "Stray `console.log` in TS/JS \u2014 tests/migration.test.js:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/migration.test.js:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27a6eff9bf182b97", "name": "Stray `console.log` in TS/JS \u2014 tests/gcal-sync.test.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/gcal-sync.test.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-664cc57fae65207c", "name": "Stray `console.log` in TS/JS \u2014 tests/group-coach-notify.test.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/group-coach-notify.test.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-c858c337f61dc032", "name": "Stray `console.log` in TS/JS \u2014 tests/discount-admin-api.test.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-admin-api.test.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-259897e3babefca2", "name": "Stray `console.log` in TS/JS \u2014 tests/discount-migration.test.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-migration.test.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-09fdd887e3340ade", "name": "Stray `console.log` in TS/JS \u2014 tests/admin-backfill.test.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-backfill.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-9e4bf3d585112411", "name": "Stray `console.log` in TS/JS \u2014 tests/backup-api.test.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/backup-api.test.js:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e509d3f1c78db11b", "name": "Stray `console.log` in TS/JS \u2014 tests/email-confirmation.test.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/email-confirmation.test.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-20b7b82063c90512", "name": "Stray `console.log` in TS/JS \u2014 tests/discount-service.test.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-service.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-82b6bc328c0a8beb", "name": "Stray `console.log` in TS/JS \u2014 tests/staff-line-bind-api.test.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/staff-line-bind-api.test.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-a41a84548288e58e", "name": "Stray `console.log` in TS/JS \u2014 tests/booking-anon.test.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-anon.test.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-52398b4a419d82b4", "name": "Stray `console.log` in TS/JS \u2014 tests/course-coach.test.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/course-coach.test.js:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f86092b20bd4d2ef", "name": "Stray `console.log` in TS/JS \u2014 tests/group-leave.test.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/group-leave.test.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-4271a87fc3c24fc0", "name": "Stray `console.log` in TS/JS \u2014 tests/availability-leave.test.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/availability-leave.test.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-819b1d17834b9ee1", "name": "Stray `console.log` in TS/JS \u2014 tests/auth-lock.test.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/auth-lock.test.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fb9dbf0c0f0d574a", "name": "Stray `console.log` in TS/JS \u2014 tests/booking-staff-phone-idor.test.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-staff-phone-idor.test.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff56a1d24a72ad52", "name": "Stray `console.log` in TS/JS \u2014 tests/refund.test.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/refund.test.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-1ddb9f3c7702c2e6", "name": "Stray `console.log` in TS/JS \u2014 tests/notifications-flow.test.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/notifications-flow.test.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-787856aa27ff9d8b", "name": "Stray `console.log` in TS/JS \u2014 tests/booking-validate-api.test.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-validate-api.test.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26a0497c6b5e7b8a", "name": "Stray `console.log` in TS/JS \u2014 tests/booking-admin-cancel.test.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-admin-cancel.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-6020177d5095849f", "name": "Stray `console.log` in TS/JS \u2014 tests/payment-flow-base.test.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/payment-flow-base.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-53cfc6253c706668", "name": "Stray `console.log` in TS/JS \u2014 tests/group-order-service.test.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/group-order-service.test.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-44de3a8bbf57ea67", "name": "Stray `console.log` in TS/JS \u2014 tests/refund-api.test.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/refund-api.test.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-d182fc4890f49df7", "name": "Stray `console.log` in TS/JS \u2014 tests/lineBindingService.test.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/lineBindingService.test.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48b3278932ee66fa", "name": "Stray `console.log` in TS/JS \u2014 tests/settings-gcal-api.test.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/settings-gcal-api.test.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-3e50ac0ca2c07c39", "name": "Stray `console.log` in TS/JS \u2014 tests/recurring-booking-api.test.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/recurring-booking-api.test.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-8fd7ab17d1612218", "name": "Stray `console.log` in TS/JS \u2014 tests/rate-limit.test.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/rate-limit.test.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-953c8e00a9d5de71", "name": "Stray `console.log` in TS/JS \u2014 tests/member-admin-api.test.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/member-admin-api.test.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be58cf3ae78e6fdc", "name": "Stray `console.log` in TS/JS \u2014 tests/booking-flow.test.js:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-flow.test.js:49"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99bd3e3413d6ea09", "name": "Stray `console.log` in TS/JS \u2014 tests/admin-session-counts.test.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-session-counts.test.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-647fb782d48533db", "name": "Stray `console.log` in TS/JS \u2014 tests/admin-reset-line-bindings.test.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-reset-line-bindings.test.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b72e3dea67194483", "name": "Stray `console.log` in TS/JS \u2014 tests/booking-payment-api.test.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-payment-api.test.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-f48c2c3d6d80e714", "name": "Stray `console.log` in TS/JS \u2014 tests/admin-group-orders.test.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-group-orders.test.js: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-6cbbf46e6f57400b", "name": "Stray `console.log` in TS/JS \u2014 tests/gcal-migration.test.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/gcal-migration.test.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f94388ecd9d6f1a7", "name": "Stray `console.log` in TS/JS \u2014 tests/booking-admin-cancel-api.test.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-admin-cancel-api.test.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-3437e61e5a8c2e52", "name": "Stray `console.log` in TS/JS \u2014 tests/gmail-auth-api.test.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/gmail-auth-api.test.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-5cbedaa7f2c01ca4", "name": "Stray `console.log` in TS/JS \u2014 tests/discount-booking.test.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-booking.test.js: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-7cdfbaed3abb4691", "name": "Stray `console.log` in TS/JS \u2014 tests/capacity.test.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/capacity.test.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f6f7e0ecf9d6a07", "name": "Stray `console.log` in TS/JS \u2014 tests/admin-notify-broadcast.test.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-notify-broadcast.test.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9bbda78f018542f0", "name": "Stray `console.log` in TS/JS \u2014 tests/discount-api.test.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-api.test.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-2be0d1b11233044e", "name": "Stray `console.log` in TS/JS \u2014 tests/booking-group-ops.test.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-group-ops.test.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ee4a952c322b137", "name": "Stray `console.log` in TS/JS \u2014 tests/backup.test.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/backup.test.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-a3497a9a743672be", "name": "Stray `console.log` in TS/JS \u2014 tests/change-password-api.test.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/change-password-api.test.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-a91fef0ac074eaaa", "name": "Stray `console.log` in TS/JS \u2014 tests/flow.test.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/flow.test.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-a0b6531008ed1303", "name": "Stray `console.log` in TS/JS \u2014 tests/group-order-tuning.test.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/group-order-tuning.test.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-400a423dde2c5000", "name": "Stray `console.log` in TS/JS \u2014 tests/course-coach-notify.test.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/course-coach-notify.test.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-efe63c87732af4b0", "name": "Stray `console.log` in TS/JS \u2014 tests/user-service.test.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/user-service.test.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83189fb254ba8e03", "name": "Stray `console.log` in TS/JS \u2014 docs/ig/generate.js:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 docs/ig/generate.js:94"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4bef47ac1e6a1e40", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 design-system/ui_kits/web/Hero.jsx:4", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 design-system/ui_kits/web/Hero.jsx:4"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e149c045b6d9208", "name": "Icon-only button without accessible name \u2014 public/admin.js:541", "shortDescription": {"text": "Icon-only button without accessible name \u2014 public/admin.js:541"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d23547b95d33ada4", "name": "Icon-only button without accessible name \u2014 public/app.js:223", "shortDescription": {"text": "Icon-only button without accessible name \u2014 public/app.js:223"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b92dcc2121c9eaf0", "name": "Stray `console.log` in TS/JS \u2014 src/scheduler.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scheduler.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-ac983771c7ec279c", "name": "Stray `console.log` in TS/JS \u2014 src/server.js:440", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/server.js:440"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-245e9f7bdbb5195b", "name": "Stray `console.log` in TS/JS \u2014 src/services/auth.js:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/auth.js:122"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b9fa0985428cc50c", "name": "Stray `console.log` in TS/JS \u2014 src/services/notifications.js:300", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/notifications.js:300"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9483ee0605480c8", "name": "Stray `console.log` in TS/JS \u2014 src/services/emailService.js:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/emailService.js:61"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-74781fdd15102a8c", "name": "Stray `console.log` in TS/JS \u2014 src/db/seed-demo.js:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/db/seed-demo.js:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc4bccbbca6d9e4b", "name": "Stray `console.log` in TS/JS \u2014 src/db/migrate.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/db/migrate.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-5642bc60206fe859", "name": "Stray `console.log` in TS/JS \u2014 src/db/connection.js:90", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/db/connection.js: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-3d2cdce1d34a54c3", "name": "Stray `console.log` in TS/JS \u2014 src/db/seed.js:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/db/seed.js:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3fad4f283eec7d6b", "name": "Docker base image is tag-pinned but not digest-pinned: node:24-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bf794c91855dbe50", "name": "Insecure pattern 'node_child_process' in docs/ig/generate.js:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in docs/ig/generate.js:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-53836099d5b6f7f7", "name": "Insecure pattern 'dangerous_innerhtml' in design-system/ui_kits/web/Hero.jsx:4", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in design-system/ui_kits/web/Hero.jsx:4"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc594af11195698f", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/coach.js:39", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/coach.js:39"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4998e239b3d22d09", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/group.js:70", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/group.js:70"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0173dd18d6e8a7c1", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin.js:34", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin.js:34"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bb6a0695762f701b", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/coaches.js:129", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/coaches.js:129"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c25e008c8b87ca97", "name": "Insecure pattern 'insert_adjacent_html' in public/coaches.js:258", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in public/coaches.js:258"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-41283f954ce3353c", "name": "Possible secret in public/login.html", "shortDescription": {"text": "Possible secret in public/login.html"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-808e243e7d2326cb", "name": "Insecure pattern 'local_storage_auth_token' in public/login.html:162", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in public/login.html:162"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f9fe8effb9486cd4", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/my-schedule.js:298", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/my-schedule.js:298"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5f8e89375e0ff72", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/app.js:200", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/app.js:200"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ad6baef05c73c19", "name": "Possible secret in src/services/auth.js", "shortDescription": {"text": "Possible secret in src/services/auth.js"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-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-6982fb546b6a6c1e", "name": "Very large file: public/admin.js (1528 lines)", "shortDescription": {"text": "Very large file: public/admin.js (1528 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-d5eaaed62cad32b0", "name": "Very large file: src/server.js (1217 lines)", "shortDescription": {"text": "Very large file: src/server.js (1217 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 43 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 17 placeholder/mock markers across 5 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-125287f00d8b2ae3", "name": "Commented-code block (6 lines) in tests/flow.test.js:56", "shortDescription": {"text": "Commented-code block (6 lines) in tests/flow.test.js:56"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d219c2bde4762f67", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/app.js:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/app.js:31"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1fe4890061b7c6e1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server.js:270", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server.js:270"}, "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-b6ac25a7f77868d0", "name": "Commented-code block (6 lines) in src/middleware/rateLimit.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/middleware/rateLimit.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21e269f211ca766e", "name": "Commented-code block (5 lines) in src/services/googleAuth.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/googleAuth.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-12de312ec6340329", "name": "Commented-code block (5 lines) in src/services/notifications.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/services/notifications.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f40f4f51a5d77cb", "name": "Commented-code block (5 lines) in src/db/schema.js:269", "shortDescription": {"text": "Commented-code block (5 lines) in src/db/schema.js:269"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-818e0f1c3abd24b3", "name": "Commented-code block (7 lines) in src/db/connection.js:51", "shortDescription": {"text": "Commented-code block (7 lines) in src/db/connection.js:51"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc0f9d8e41b33b0e", "name": "11 env vars used in code but missing from .env.example", "shortDescription": {"text": "11 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BANK_INFO`, `DB_PATH`, `GCAL_MOCK`, `GMAIL_MOCK`, `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, `LINE_CHANNEL_ACCESS_TOKEN`, `LINE_CHANNEL_SECRET` + 3 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-1835916490fad35c", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (src/server.js:270)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (src/server.js:270)"}, "fullDescription": {"text": "`src/server.js:270` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b4a364f70f67f367", "name": "Dangling fetch: GET https://www.googleapis.com/oauth2/v2/userinfo (src/server.js:288)", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/oauth2/v2/userinfo (src/server.js:288)"}, "fullDescription": {"text": "`src/server.js:288` calls `GET https://www.googleapis.com/oauth2/v2/userinfo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/oauth2/v2/userinfo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c8cdd9847f014c8", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (src/server.js:349)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (src/server.js:349)"}, "fullDescription": {"text": "`src/server.js:349` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4cb38694216baa5e", "name": "Unused endpoint: GET /my.html", "shortDescription": {"text": "Unused endpoint: GET /my.html"}, "fullDescription": {"text": "`src/server.js` declares `GET /my.html` 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-770cd1e6f0ccb5fa", "name": "Unused endpoint: GET /my-bookings.html", "shortDescription": {"text": "Unused endpoint: GET /my-bookings.html"}, "fullDescription": {"text": "`src/server.js` declares `GET /my-bookings.html` 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-760e21a62d709745", "name": "Unused endpoint: GET /line.html", "shortDescription": {"text": "Unused endpoint: GET /line.html"}, "fullDescription": {"text": "`src/server.js` declares `GET /line.html` 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-1f48eae3d2ff9864", "name": "Unused endpoint: GET /my-schedule", "shortDescription": {"text": "Unused endpoint: GET /my-schedule"}, "fullDescription": {"text": "`src/server.js` declares `GET /my-schedule` 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-e1edff994c955630", "name": "Unused endpoint: USE /avatars", "shortDescription": {"text": "Unused endpoint: USE /avatars"}, "fullDescription": {"text": "`src/server.js` declares `USE /avatars` 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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/health` 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-fd55aa0818a7c897", "name": "Unused endpoint: POST /api/auth/login", "shortDescription": {"text": "Unused endpoint: POST /api/auth/login"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/auth/login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d5a39262ac205120", "name": "Unused endpoint: POST /api/auth/logout", "shortDescription": {"text": "Unused endpoint: POST /api/auth/logout"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/auth/logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-866cfadefccd0b5c", "name": "Unused endpoint: POST /api/auth/change-password", "shortDescription": {"text": "Unused endpoint: POST /api/auth/change-password"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/auth/change-password` 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-ee4aa5ddab88c9dc", "name": "Unused endpoint: GET /api/auth/me", "shortDescription": {"text": "Unused endpoint: GET /api/auth/me"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/auth/me` 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-81e21e72fc4b9a29", "name": "Unused endpoint: GET /api/my/line", "shortDescription": {"text": "Unused endpoint: GET /api/my/line"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/my/line` 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-96f933e58595247c", "name": "Unused endpoint: POST /api/my/line/bind-code", "shortDescription": {"text": "Unused endpoint: POST /api/my/line/bind-code"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/my/line/bind-code` 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-a8b0175b9d2acd6b", "name": "Unused endpoint: DELETE /api/my/line", "shortDescription": {"text": "Unused endpoint: DELETE /api/my/line"}, "fullDescription": {"text": "`src/server.js` declares `DELETE /api/my/line` 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-065a7629e7f86caf", "name": "Unused endpoint: GET /api/auth/google", "shortDescription": {"text": "Unused endpoint: GET /api/auth/google"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/auth/google` 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-ab9e687c0618f84d", "name": "Unused endpoint: GET /api/auth/google/callback", "shortDescription": {"text": "Unused endpoint: GET /api/auth/google/callback"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/auth/google/callback` 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-b8f560a006403224", "name": "Unused endpoint: POST /api/admin/gmail-auth/start", "shortDescription": {"text": "Unused endpoint: POST /api/admin/gmail-auth/start"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/admin/gmail-auth/start` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2226fda531799f22", "name": "Unused endpoint: GET /api/admin/gmail-auth/callback", "shortDescription": {"text": "Unused endpoint: GET /api/admin/gmail-auth/callback"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/admin/gmail-auth/callback` 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-bf2e6e2188a510ee", "name": "Unused endpoint: GET /api/sessions", "shortDescription": {"text": "Unused endpoint: GET /api/sessions"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a48f7d480209b198", "name": "Unused endpoint: GET /api/admin/templates", "shortDescription": {"text": "Unused endpoint: GET /api/admin/templates"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/admin/templates` 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-1dd46f82f38253e9", "name": "Unused endpoint: GET /api/admin/templates/:id", "shortDescription": {"text": "Unused endpoint: GET /api/admin/templates/:id"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/admin/templates/: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-7f5b41dad8c4df77", "name": "Unused endpoint: POST /api/admin/templates", "shortDescription": {"text": "Unused endpoint: POST /api/admin/templates"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/admin/templates` 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-94e3314a987a5c40", "name": "Unused endpoint: PATCH /api/admin/templates/:id", "shortDescription": {"text": "Unused endpoint: PATCH /api/admin/templates/:id"}, "fullDescription": {"text": "`src/server.js` declares `PATCH /api/admin/templates/: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-c54076d2403390bb", "name": "Unused endpoint: DELETE /api/admin/templates/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/templates/:id"}, "fullDescription": {"text": "`src/server.js` declares `DELETE /api/admin/templates/: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-008cef6f269fe772", "name": "Unused endpoint: GET /api/admin/sessions/:id/registrations", "shortDescription": {"text": "Unused endpoint: GET /api/admin/sessions/:id/registrations"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/admin/sessions/:id/registrations` 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-b9a2ed7024ab223c", "name": "Unused endpoint: PATCH /api/admin/sessions/:id", "shortDescription": {"text": "Unused endpoint: PATCH /api/admin/sessions/:id"}, "fullDescription": {"text": "`src/server.js` declares `PATCH /api/admin/sessions/: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-0eb4e92c25d4ed3c", "name": "Unused endpoint: GET /api/admin/categories", "shortDescription": {"text": "Unused endpoint: GET /api/admin/categories"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/admin/categories` 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-a26cc83db053e831", "name": "Unused endpoint: POST /api/admin/categories", "shortDescription": {"text": "Unused endpoint: POST /api/admin/categories"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/admin/categories` 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-db2990b300f8c8fa", "name": "Unused endpoint: PATCH /api/admin/categories/:id", "shortDescription": {"text": "Unused endpoint: PATCH /api/admin/categories/:id"}, "fullDescription": {"text": "`src/server.js` declares `PATCH /api/admin/categories/: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-5488f68f1e917210", "name": "Unused endpoint: DELETE /api/admin/categories/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/categories/:id"}, "fullDescription": {"text": "`src/server.js` declares `DELETE /api/admin/categories/: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-b4d87f54d62a1386", "name": "Unused endpoint: GET /api/admin/users", "shortDescription": {"text": "Unused endpoint: GET /api/admin/users"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/admin/users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00f2e5ab41a67cee", "name": "Unused endpoint: POST /api/admin/line/reset-all", "shortDescription": {"text": "Unused endpoint: POST /api/admin/line/reset-all"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/admin/line/reset-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-db664069e05b68b9", "name": "Unused endpoint: PATCH /api/admin/users/:id/role", "shortDescription": {"text": "Unused endpoint: PATCH /api/admin/users/:id/role"}, "fullDescription": {"text": "`src/server.js` declares `PATCH /api/admin/users/:id/role` 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-2177c20b49eec710", "name": "Unused endpoint: PATCH /api/admin/users/:id", "shortDescription": {"text": "Unused endpoint: PATCH /api/admin/users/:id"}, "fullDescription": {"text": "`src/server.js` declares `PATCH /api/admin/users/: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-423994969f2da2fc", "name": "Unused endpoint: POST /api/admin/users/:id/archive", "shortDescription": {"text": "Unused endpoint: POST /api/admin/users/:id/archive"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/admin/users/:id/archive` 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-ee20c9bfd2d3fb52", "name": "Unused endpoint: POST /api/admin/users/:id/restore", "shortDescription": {"text": "Unused endpoint: POST /api/admin/users/:id/restore"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/admin/users/:id/restore` 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-41a4ed01d7141fb5", "name": "Unused endpoint: POST /api/admin/coaches/account", "shortDescription": {"text": "Unused endpoint: POST /api/admin/coaches/account"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/admin/coaches/account` 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-504897b15cd9aa17", "name": "Unused endpoint: GET /api/admin/coaches", "shortDescription": {"text": "Unused endpoint: GET /api/admin/coaches"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/admin/coaches` 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-73f63bc10c65f3ad", "name": "Unused endpoint: PATCH /api/admin/coaches/:id", "shortDescription": {"text": "Unused endpoint: PATCH /api/admin/coaches/:id"}, "fullDescription": {"text": "`src/server.js` declares `PATCH /api/admin/coaches/: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-497859f0dbf33679", "name": "Unused endpoint: DELETE /api/admin/coaches/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/coaches/:id"}, "fullDescription": {"text": "`src/server.js` declares `DELETE /api/admin/coaches/: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-bbcfdeb8ab466973", "name": "Unused endpoint: GET /api/coach/me", "shortDescription": {"text": "Unused endpoint: GET /api/coach/me"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/coach/me` 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-4c980da79507c3c3", "name": "Unused endpoint: PATCH /api/coach/me/profile", "shortDescription": {"text": "Unused endpoint: PATCH /api/coach/me/profile"}, "fullDescription": {"text": "`src/server.js` declares `PATCH /api/coach/me/profile` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff52be2a859e9a56", "name": "Unused endpoint: GET /api/coach/me/rules", "shortDescription": {"text": "Unused endpoint: GET /api/coach/me/rules"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/coach/me/rules` 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-e8326c2d77460680", "name": "Unused endpoint: POST /api/coach/me/rules", "shortDescription": {"text": "Unused endpoint: POST /api/coach/me/rules"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/coach/me/rules` 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-c36c18525b6f966a", "name": "Unused endpoint: DELETE /api/coach/me/rules/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/coach/me/rules/:id"}, "fullDescription": {"text": "`src/server.js` declares `DELETE /api/coach/me/rules/: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-edc3d4b5ce592aad", "name": "Unused endpoint: GET /api/coach/me/exceptions", "shortDescription": {"text": "Unused endpoint: GET /api/coach/me/exceptions"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/coach/me/exceptions` 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-0d506cdddf6fbc17", "name": "Unused endpoint: POST /api/coach/me/exceptions", "shortDescription": {"text": "Unused endpoint: POST /api/coach/me/exceptions"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/coach/me/exceptions` 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-53bfcf48682a22b7", "name": "Unused endpoint: DELETE /api/coach/me/exceptions/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/coach/me/exceptions/:id"}, "fullDescription": {"text": "`src/server.js` declares `DELETE /api/coach/me/exceptions/: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-d5c1b83bc540590b", "name": "Unused endpoint: GET /api/coach/me/bookings", "shortDescription": {"text": "Unused endpoint: GET /api/coach/me/bookings"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/coach/me/bookings` 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-1601be44ecdf7d7c", "name": "Unused endpoint: GET /api/coach/me/availability-preview", "shortDescription": {"text": "Unused endpoint: GET /api/coach/me/availability-preview"}, "fullDescription": {"text": "`src/server.js` declares `GET /api/coach/me/availability-preview` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bad986b44e3e9f0a", "name": "Unused endpoint: POST /api/coach/me/avatar", "shortDescription": {"text": "Unused endpoint: POST /api/coach/me/avatar"}, "fullDescription": {"text": "`src/server.js` declares `POST /api/coach/me/avatar` 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/20805"}, "properties": {"repository": "tamiyame/chinup-fitness-system", "repoUrl": "https://github.com/tamiyame/chinup-fitness-system", "branch": "main"}, "results": [{"ruleId": "scanner-a9bc2077187e3ca2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/my-schedule-routing.test.js:11"}, "properties": {"repobilityId": "a6f3b5c1b8600cf8", "scanner": "scanner-primary", "fingerprint": "a9bc2077187e3ca2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3921f16a5d22c83f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/recurring-booking.test.js:10"}, "properties": {"repobilityId": "276afe0d7fb4794e", "scanner": "scanner-primary", "fingerprint": "3921f16a5d22c83f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f0f67c2b1c812148", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/public-api.test.js:10"}, "properties": {"repobilityId": "57e00c16d40d8c54", "scanner": "scanner-primary", "fingerprint": "f0f67c2b1c812148", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25f7e7f4ebe2589f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-group.test.js:20"}, "properties": {"repobilityId": "73c4caca0fc3cf88", "scanner": "scanner-primary", "fingerprint": "25f7e7f4ebe2589f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a078277275b67875", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/google-auth.test.js:6"}, "properties": {"repobilityId": "d0ac91f4689ad6c0", "scanner": "scanner-primary", "fingerprint": "a078277275b67875", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1425b1ff1d28e742", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-payment.test.js:8"}, "properties": {"repobilityId": "d9c1871f0f8b92a1", "scanner": "scanner-primary", "fingerprint": "1425b1ff1d28e742", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7ba30b965eec2120", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/my-schedule-service.test.js:27"}, "properties": {"repobilityId": "4da918c8a8cff7c3", "scanner": "scanner-primary", "fingerprint": "7ba30b965eec2120", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fd0ea227b2c3ebab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-backfill-api.test.js:16"}, "properties": {"repobilityId": "509d71736f18d52d", "scanner": "scanner-primary", "fingerprint": "fd0ea227b2c3ebab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2373e234e9a0c992", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/course-price.test.js:6"}, "properties": {"repobilityId": "ae2e6067e8f36b44", "scanner": "scanner-primary", "fingerprint": "2373e234e9a0c992", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ca60808c5ad06c7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/lineClient.test.js:7"}, "properties": {"repobilityId": "4356189cf25d223f", "scanner": "scanner-primary", "fingerprint": "8ca60808c5ad06c7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de58074a79625fa2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/migration.test.js:40"}, "properties": {"repobilityId": "d1475143aff1370c", "scanner": "scanner-primary", "fingerprint": "de58074a79625fa2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-27a6eff9bf182b97", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/gcal-sync.test.js:10"}, "properties": {"repobilityId": "327c71f1127bbf95", "scanner": "scanner-primary", "fingerprint": "27a6eff9bf182b97", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-664cc57fae65207c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/group-coach-notify.test.js:9"}, "properties": {"repobilityId": "b935f5654f416458", "scanner": "scanner-primary", "fingerprint": "664cc57fae65207c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c858c337f61dc032", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-admin-api.test.js:21"}, "properties": {"repobilityId": "f08807359bd96eaf", "scanner": "scanner-primary", "fingerprint": "c858c337f61dc032", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-259897e3babefca2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-migration.test.js:21"}, "properties": {"repobilityId": "d94d7d9fcbf06861", "scanner": "scanner-primary", "fingerprint": "259897e3babefca2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09fdd887e3340ade", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-backfill.test.js:7"}, "properties": {"repobilityId": "04cc298dd9fbdd03", "scanner": "scanner-primary", "fingerprint": "09fdd887e3340ade", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9e4bf3d585112411", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/backup-api.test.js:27"}, "properties": {"repobilityId": "3b0a22e2efb76690", "scanner": "scanner-primary", "fingerprint": "9e4bf3d585112411", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e509d3f1c78db11b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/email-confirmation.test.js:9"}, "properties": {"repobilityId": "3bfb81a9ce5bf865", "scanner": "scanner-primary", "fingerprint": "e509d3f1c78db11b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20b7b82063c90512", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-service.test.js:7"}, "properties": {"repobilityId": "ab5fc9f28492c722", "scanner": "scanner-primary", "fingerprint": "20b7b82063c90512", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-82b6bc328c0a8beb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/staff-line-bind-api.test.js:22"}, "properties": {"repobilityId": "1cd3385e6e737347", "scanner": "scanner-primary", "fingerprint": "82b6bc328c0a8beb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a41a84548288e58e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-anon.test.js:18"}, "properties": {"repobilityId": "bc685e92ada795c8", "scanner": "scanner-primary", "fingerprint": "a41a84548288e58e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52398b4a419d82b4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/course-coach.test.js:8"}, "properties": {"repobilityId": "30308aa13d259891", "scanner": "scanner-primary", "fingerprint": "52398b4a419d82b4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f86092b20bd4d2ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/group-leave.test.js:9"}, "properties": {"repobilityId": "ece559a66e5fc76d", "scanner": "scanner-primary", "fingerprint": "f86092b20bd4d2ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4271a87fc3c24fc0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/availability-leave.test.js:6"}, "properties": {"repobilityId": "ade0264b75e32744", "scanner": "scanner-primary", "fingerprint": "4271a87fc3c24fc0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-819b1d17834b9ee1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/auth-lock.test.js:6"}, "properties": {"repobilityId": "375727d5b440e609", "scanner": "scanner-primary", "fingerprint": "819b1d17834b9ee1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb9dbf0c0f0d574a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-staff-phone-idor.test.js:12"}, "properties": {"repobilityId": "7810699f737d6b94", "scanner": "scanner-primary", "fingerprint": "fb9dbf0c0f0d574a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ff56a1d24a72ad52", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/refund.test.js:9"}, "properties": {"repobilityId": "3e37a9eecc43f805", "scanner": "scanner-primary", "fingerprint": "ff56a1d24a72ad52", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1ddb9f3c7702c2e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/notifications-flow.test.js:26"}, "properties": {"repobilityId": "5a691f63cf3a00f8", "scanner": "scanner-primary", "fingerprint": "1ddb9f3c7702c2e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-787856aa27ff9d8b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-validate-api.test.js:12"}, "properties": {"repobilityId": "d5fde17e0e171cbc", "scanner": "scanner-primary", "fingerprint": "787856aa27ff9d8b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-26a0497c6b5e7b8a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-admin-cancel.test.js:7"}, "properties": {"repobilityId": "c0d8d1f9def2eaa3", "scanner": "scanner-primary", "fingerprint": "26a0497c6b5e7b8a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6020177d5095849f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/payment-flow-base.test.js:7"}, "properties": {"repobilityId": "a8b4e35566d02465", "scanner": "scanner-primary", "fingerprint": "6020177d5095849f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-53cfc6253c706668", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/group-order-service.test.js:19"}, "properties": {"repobilityId": "3e963559f102ac05", "scanner": "scanner-primary", "fingerprint": "53cfc6253c706668", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-44de3a8bbf57ea67", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/refund-api.test.js:14"}, "properties": {"repobilityId": "5c5938598c1e7c42", "scanner": "scanner-primary", "fingerprint": "44de3a8bbf57ea67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d182fc4890f49df7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/lineBindingService.test.js:12"}, "properties": {"repobilityId": "04838244bd70e16c", "scanner": "scanner-primary", "fingerprint": "d182fc4890f49df7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48b3278932ee66fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/settings-gcal-api.test.js:11"}, "properties": {"repobilityId": "56cca94d232bd00e", "scanner": "scanner-primary", "fingerprint": "48b3278932ee66fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e50ac0ca2c07c39", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/recurring-booking-api.test.js:14"}, "properties": {"repobilityId": "274eac786fbd5235", "scanner": "scanner-primary", "fingerprint": "3e50ac0ca2c07c39", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8fd7ab17d1612218", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/rate-limit.test.js:16"}, "properties": {"repobilityId": "a7808d85db557ed1", "scanner": "scanner-primary", "fingerprint": "8fd7ab17d1612218", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-953c8e00a9d5de71", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/member-admin-api.test.js:16"}, "properties": {"repobilityId": "375061a3dca7b989", "scanner": "scanner-primary", "fingerprint": "953c8e00a9d5de71", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-be58cf3ae78e6fdc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-flow.test.js:49"}, "properties": {"repobilityId": "7e51f99677093976", "scanner": "scanner-primary", "fingerprint": "be58cf3ae78e6fdc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-99bd3e3413d6ea09", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-session-counts.test.js:9"}, "properties": {"repobilityId": "6f3748d666963a06", "scanner": "scanner-primary", "fingerprint": "99bd3e3413d6ea09", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-647fb782d48533db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-reset-line-bindings.test.js:6"}, "properties": {"repobilityId": "c8ce893798c2fafb", "scanner": "scanner-primary", "fingerprint": "647fb782d48533db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b72e3dea67194483", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-payment-api.test.js:14"}, "properties": {"repobilityId": "955e2667378cb8cb", "scanner": "scanner-primary", "fingerprint": "b72e3dea67194483", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f48c2c3d6d80e714", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-group-orders.test.js:20"}, "properties": {"repobilityId": "5e4f132776b0135a", "scanner": "scanner-primary", "fingerprint": "f48c2c3d6d80e714", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6cbbf46e6f57400b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/gcal-migration.test.js:6"}, "properties": {"repobilityId": "772d874fbfed797d", "scanner": "scanner-primary", "fingerprint": "6cbbf46e6f57400b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f94388ecd9d6f1a7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-admin-cancel-api.test.js:14"}, "properties": {"repobilityId": "193f0d24c4045757", "scanner": "scanner-primary", "fingerprint": "f94388ecd9d6f1a7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3437e61e5a8c2e52", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/gmail-auth-api.test.js:13"}, "properties": {"repobilityId": "7c4081e9c9a42b91", "scanner": "scanner-primary", "fingerprint": "3437e61e5a8c2e52", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5cbedaa7f2c01ca4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-booking.test.js:20"}, "properties": {"repobilityId": "ae9fdf0440d28c97", "scanner": "scanner-primary", "fingerprint": "5cbedaa7f2c01ca4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7cdfbaed3abb4691", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/capacity.test.js:6"}, "properties": {"repobilityId": "180a74e10a43bbc0", "scanner": "scanner-primary", "fingerprint": "7cdfbaed3abb4691", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9f6f7e0ecf9d6a07", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/admin-notify-broadcast.test.js:10"}, "properties": {"repobilityId": "856783e801fa9ce0", "scanner": "scanner-primary", "fingerprint": "9f6f7e0ecf9d6a07", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9bbda78f018542f0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/discount-api.test.js:23"}, "properties": {"repobilityId": "bb03b38edcd59594", "scanner": "scanner-primary", "fingerprint": "9bbda78f018542f0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2be0d1b11233044e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/booking-group-ops.test.js:10"}, "properties": {"repobilityId": "7d61deea38c0363d", "scanner": "scanner-primary", "fingerprint": "2be0d1b11233044e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ee4a952c322b137", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/backup.test.js:9"}, "properties": {"repobilityId": "e9c8b56b7809ddb2", "scanner": "scanner-primary", "fingerprint": "3ee4a952c322b137", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a3497a9a743672be", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/change-password-api.test.js:13"}, "properties": {"repobilityId": "8ad01dfbe0101a3c", "scanner": "scanner-primary", "fingerprint": "a3497a9a743672be", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a91fef0ac074eaaa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/flow.test.js:18"}, "properties": {"repobilityId": "972c0d8d2a3cdd45", "scanner": "scanner-primary", "fingerprint": "a91fef0ac074eaaa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a0b6531008ed1303", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/group-order-tuning.test.js:10"}, "properties": {"repobilityId": "28b648f03cffda2e", "scanner": "scanner-primary", "fingerprint": "a0b6531008ed1303", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-400a423dde2c5000", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/course-coach-notify.test.js:9"}, "properties": {"repobilityId": "085f6f2811d7d9cc", "scanner": "scanner-primary", "fingerprint": "400a423dde2c5000", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-efe63c87732af4b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/user-service.test.js:10"}, "properties": {"repobilityId": "6dcbb5f73f5bd344", "scanner": "scanner-primary", "fingerprint": "efe63c87732af4b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83189fb254ba8e03", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 docs/ig/generate.js:94"}, "properties": {"repobilityId": "fb87b1cee2244fa8", "scanner": "scanner-primary", "fingerprint": "83189fb254ba8e03", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4bef47ac1e6a1e40", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 design-system/ui_kits/web/Hero.jsx:4"}, "properties": {"repobilityId": "ff9214b539c415ed", "scanner": "scanner-primary", "fingerprint": "4bef47ac1e6a1e40", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6e149c045b6d9208", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 public/admin.js:541"}, "properties": {"repobilityId": "7dbf1eb0c08cbf7d", "scanner": "scanner-primary", "fingerprint": "6e149c045b6d9208", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d23547b95d33ada4", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 public/app.js:223"}, "properties": {"repobilityId": "da7e9841f48bb512", "scanner": "scanner-primary", "fingerprint": "d23547b95d33ada4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b92dcc2121c9eaf0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scheduler.js:13"}, "properties": {"repobilityId": "0ab545eb4c94240e", "scanner": "scanner-primary", "fingerprint": "b92dcc2121c9eaf0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac983771c7ec279c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/server.js:440"}, "properties": {"repobilityId": "51ec0d6adae748e2", "scanner": "scanner-primary", "fingerprint": "ac983771c7ec279c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-245e9f7bdbb5195b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/auth.js:122"}, "properties": {"repobilityId": "0215b876549da73e", "scanner": "scanner-primary", "fingerprint": "245e9f7bdbb5195b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b9fa0985428cc50c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/notifications.js:300"}, "properties": {"repobilityId": "d3964fb742ba46cd", "scanner": "scanner-primary", "fingerprint": "b9fa0985428cc50c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c9483ee0605480c8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/emailService.js:61"}, "properties": {"repobilityId": "52b3418b5b745c80", "scanner": "scanner-primary", "fingerprint": "c9483ee0605480c8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-74781fdd15102a8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/db/seed-demo.js:86"}, "properties": {"repobilityId": "d1af2cd5b7201b61", "scanner": "scanner-primary", "fingerprint": "74781fdd15102a8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc4bccbbca6d9e4b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/db/migrate.js:13"}, "properties": {"repobilityId": "b28605b8642e4d70", "scanner": "scanner-primary", "fingerprint": "fc4bccbbca6d9e4b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5642bc60206fe859", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/db/connection.js:90"}, "properties": {"repobilityId": "32be7a308eb98eb9", "scanner": "scanner-primary", "fingerprint": "5642bc60206fe859", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3d2cdce1d34a54c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/db/seed.js:39"}, "properties": {"repobilityId": "77c59e07182dcfdd", "scanner": "scanner-primary", "fingerprint": "3d2cdce1d34a54c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-3fad4f283eec7d6b", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-alpine"}, "properties": {"repobilityId": "8b78747a686e7c75", "scanner": "scanner-primary", "fingerprint": "3fad4f283eec7d6b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-bf794c91855dbe50", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in docs/ig/generate.js:3"}, "properties": {"repobilityId": "85ae51b46f1948cb", "scanner": "scanner-primary", "fingerprint": "bf794c91855dbe50", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/ig/generate.js"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-53836099d5b6f7f7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in design-system/ui_kits/web/Hero.jsx:4"}, "properties": {"repobilityId": "9c2b475628350038", "scanner": "scanner-primary", "fingerprint": "53836099d5b6f7f7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "design-system/ui_kits/web/Hero.jsx"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-dc594af11195698f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/coach.js:39"}, "properties": {"repobilityId": "3a740989ac8d201a", "scanner": "scanner-primary", "fingerprint": "dc594af11195698f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/coach.js"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-4998e239b3d22d09", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/group.js:70"}, "properties": {"repobilityId": "0404aab57ee80b5f", "scanner": "scanner-primary", "fingerprint": "4998e239b3d22d09", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/group.js"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-0173dd18d6e8a7c1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin.js:34"}, "properties": {"repobilityId": "3017548a2ea32519", "scanner": "scanner-primary", "fingerprint": "0173dd18d6e8a7c1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin.js"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-bb6a0695762f701b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/coaches.js:129"}, "properties": {"repobilityId": "b781b222df531bf8", "scanner": "scanner-primary", "fingerprint": "bb6a0695762f701b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/coaches.js"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-c25e008c8b87ca97", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in public/coaches.js:258"}, "properties": {"repobilityId": "9c2d66a731c4830b", "scanner": "scanner-primary", "fingerprint": "c25e008c8b87ca97", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/coaches.js"}, "region": {"startLine": 258}}}]}, {"ruleId": "scanner-41283f954ce3353c", "level": "error", "message": {"text": "Possible secret in public/login.html"}, "properties": {"repobilityId": "7761010656da8092", "scanner": "scanner-primary", "fingerprint": "41283f954ce3353c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/login.html"}, "region": {"startLine": 205}}}]}, {"ruleId": "scanner-808e243e7d2326cb", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in public/login.html:162"}, "properties": {"repobilityId": "534339f7f4c6c0ad", "scanner": "scanner-primary", "fingerprint": "808e243e7d2326cb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/login.html"}, "region": {"startLine": 162}}}]}, {"ruleId": "scanner-f9fe8effb9486cd4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/my-schedule.js:298"}, "properties": {"repobilityId": "9ea0c8871680a094", "scanner": "scanner-primary", "fingerprint": "f9fe8effb9486cd4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/my-schedule.js"}, "region": {"startLine": 298}}}]}, {"ruleId": "scanner-d5f8e89375e0ff72", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/app.js:200"}, "properties": {"repobilityId": "5192b9054ebe3f07", "scanner": "scanner-primary", "fingerprint": "d5f8e89375e0ff72", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/app.js"}, "region": {"startLine": 200}}}]}, {"ruleId": "scanner-8ad6baef05c73c19", "level": "error", "message": {"text": "Possible secret in src/services/auth.js"}, "properties": {"repobilityId": "8ed6a85df034c4b0", "scanner": "scanner-primary", "fingerprint": "8ad6baef05c73c19", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/services/auth.js"}, "region": {"startLine": 182}}}]}, {"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-6982fb546b6a6c1e", "level": "note", "message": {"text": "Very large file: public/admin.js (1528 lines)"}, "properties": {"repobilityId": "4f9dbe7c94273c2f", "scanner": "scanner-primary", "fingerprint": "6982fb546b6a6c1e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d5eaaed62cad32b0", "level": "note", "message": {"text": "Very large file: src/server.js (1217 lines)"}, "properties": {"repobilityId": "ba2a4d84798285f4", "scanner": "scanner-primary", "fingerprint": "d5eaaed62cad32b0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "cf05869dd8a7aff1", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "b182dcfbbb6f1c51", "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": "b86313ba0732e2bb", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "e2c2485ecc00d700", "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": "03a1c25de220f77b", "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": "91693c2c34ef7cfb", "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": "1138bb9a4349a568", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-125287f00d8b2ae3", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/flow.test.js:56"}, "properties": {"repobilityId": "911fbd3fe5fd0c6d", "scanner": "scanner-primary", "fingerprint": "125287f00d8b2ae3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d219c2bde4762f67", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/app.js:31"}, "properties": {"repobilityId": "9560835143d3aac2", "scanner": "scanner-primary", "fingerprint": "d219c2bde4762f67", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1fe4890061b7c6e1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server.js:270"}, "properties": {"repobilityId": "194807aa5eadba1c", "scanner": "scanner-primary", "fingerprint": "1fe4890061b7c6e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b6ac25a7f77868d0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/middleware/rateLimit.js:1"}, "properties": {"repobilityId": "180ddf098c247383", "scanner": "scanner-primary", "fingerprint": "b6ac25a7f77868d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21e269f211ca766e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/googleAuth.js:1"}, "properties": {"repobilityId": "41d358d803b3f15e", "scanner": "scanner-primary", "fingerprint": "21e269f211ca766e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12de312ec6340329", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/services/notifications.js:1"}, "properties": {"repobilityId": "985644c9d1e397f7", "scanner": "scanner-primary", "fingerprint": "12de312ec6340329", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f40f4f51a5d77cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/db/schema.js:269"}, "properties": {"repobilityId": "ed49d96b5b656dc6", "scanner": "scanner-primary", "fingerprint": "1f40f4f51a5d77cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-818e0f1c3abd24b3", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/db/connection.js:51"}, "properties": {"repobilityId": "3f3f09b72ab71f32", "scanner": "scanner-primary", "fingerprint": "818e0f1c3abd24b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc0f9d8e41b33b0e", "level": "note", "message": {"text": "11 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "c82cd8cd626c3599", "scanner": "scanner-primary", "fingerprint": "cc0f9d8e41b33b0e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-1835916490fad35c", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (src/server.js:270)"}, "properties": {"repobilityId": "87a205f07d8744f9", "scanner": "scanner-primary", "fingerprint": "1835916490fad35c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b4a364f70f67f367", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/oauth2/v2/userinfo (src/server.js:288)"}, "properties": {"repobilityId": "eca2549d66b15b11", "scanner": "scanner-primary", "fingerprint": "b4a364f70f67f367", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2c8cdd9847f014c8", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (src/server.js:349)"}, "properties": {"repobilityId": "d36891de4dc8f798", "scanner": "scanner-primary", "fingerprint": "2c8cdd9847f014c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4cb38694216baa5e", "level": "note", "message": {"text": "Unused endpoint: GET /my.html"}, "properties": {"repobilityId": "084979d2c22da750", "scanner": "scanner-primary", "fingerprint": "4cb38694216baa5e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-770cd1e6f0ccb5fa", "level": "note", "message": {"text": "Unused endpoint: GET /my-bookings.html"}, "properties": {"repobilityId": "bf85aa7446b7bac6", "scanner": "scanner-primary", "fingerprint": "770cd1e6f0ccb5fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-760e21a62d709745", "level": "note", "message": {"text": "Unused endpoint: GET /line.html"}, "properties": {"repobilityId": "0e8daccde61b870b", "scanner": "scanner-primary", "fingerprint": "760e21a62d709745", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f48eae3d2ff9864", "level": "note", "message": {"text": "Unused endpoint: GET /my-schedule"}, "properties": {"repobilityId": "802b28629e074f57", "scanner": "scanner-primary", "fingerprint": "1f48eae3d2ff9864", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1edff994c955630", "level": "note", "message": {"text": "Unused endpoint: USE /avatars"}, "properties": {"repobilityId": "67178633b501fde8", "scanner": "scanner-primary", "fingerprint": "e1edff994c955630", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "45bf586efbfc4365", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd55aa0818a7c897", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/login"}, "properties": {"repobilityId": "bd3dd4efd8a1cdfb", "scanner": "scanner-primary", "fingerprint": "fd55aa0818a7c897", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5a39262ac205120", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/logout"}, "properties": {"repobilityId": "badacea7a8dc285d", "scanner": "scanner-primary", "fingerprint": "d5a39262ac205120", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-866cfadefccd0b5c", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/change-password"}, "properties": {"repobilityId": "6cae8e38e6413495", "scanner": "scanner-primary", "fingerprint": "866cfadefccd0b5c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee4aa5ddab88c9dc", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/me"}, "properties": {"repobilityId": "14508359a4383db5", "scanner": "scanner-primary", "fingerprint": "ee4aa5ddab88c9dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81e21e72fc4b9a29", "level": "note", "message": {"text": "Unused endpoint: GET /api/my/line"}, "properties": {"repobilityId": "d82428721dc8afe0", "scanner": "scanner-primary", "fingerprint": "81e21e72fc4b9a29", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-96f933e58595247c", "level": "note", "message": {"text": "Unused endpoint: POST /api/my/line/bind-code"}, "properties": {"repobilityId": "f79adc042f605665", "scanner": "scanner-primary", "fingerprint": "96f933e58595247c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8b0175b9d2acd6b", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/my/line"}, "properties": {"repobilityId": "44b8ce6efa7395b6", "scanner": "scanner-primary", "fingerprint": "a8b0175b9d2acd6b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-065a7629e7f86caf", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/google"}, "properties": {"repobilityId": "ba27ed1483578c17", "scanner": "scanner-primary", "fingerprint": "065a7629e7f86caf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab9e687c0618f84d", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/google/callback"}, "properties": {"repobilityId": "79e5eb114d760335", "scanner": "scanner-primary", "fingerprint": "ab9e687c0618f84d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b8f560a006403224", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/gmail-auth/start"}, "properties": {"repobilityId": "e43aee88724b9eee", "scanner": "scanner-primary", "fingerprint": "b8f560a006403224", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2226fda531799f22", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/gmail-auth/callback"}, "properties": {"repobilityId": "17be45ecdc8b7a0d", "scanner": "scanner-primary", "fingerprint": "2226fda531799f22", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf2e6e2188a510ee", "level": "note", "message": {"text": "Unused endpoint: GET /api/sessions"}, "properties": {"repobilityId": "0202ea676d71bd05", "scanner": "scanner-primary", "fingerprint": "bf2e6e2188a510ee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a48f7d480209b198", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/templates"}, "properties": {"repobilityId": "b8d42ba344dd4508", "scanner": "scanner-primary", "fingerprint": "a48f7d480209b198", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1dd46f82f38253e9", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/templates/:id"}, "properties": {"repobilityId": "5a16230d0796850d", "scanner": "scanner-primary", "fingerprint": "1dd46f82f38253e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f5b41dad8c4df77", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/templates"}, "properties": {"repobilityId": "c0997ff93ed5df72", "scanner": "scanner-primary", "fingerprint": "7f5b41dad8c4df77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-94e3314a987a5c40", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/admin/templates/:id"}, "properties": {"repobilityId": "1e8b4a4f07b23c8f", "scanner": "scanner-primary", "fingerprint": "94e3314a987a5c40", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c54076d2403390bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/templates/:id"}, "properties": {"repobilityId": "5407ecd1fac2b634", "scanner": "scanner-primary", "fingerprint": "c54076d2403390bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-008cef6f269fe772", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/sessions/:id/registrations"}, "properties": {"repobilityId": "00e897249b18f97b", "scanner": "scanner-primary", "fingerprint": "008cef6f269fe772", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9a2ed7024ab223c", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/admin/sessions/:id"}, "properties": {"repobilityId": "c1b898f11cc204c8", "scanner": "scanner-primary", "fingerprint": "b9a2ed7024ab223c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0eb4e92c25d4ed3c", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/categories"}, "properties": {"repobilityId": "9209ee5397cf5c52", "scanner": "scanner-primary", "fingerprint": "0eb4e92c25d4ed3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a26cc83db053e831", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/categories"}, "properties": {"repobilityId": "d843effb90cb5e2b", "scanner": "scanner-primary", "fingerprint": "a26cc83db053e831", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db2990b300f8c8fa", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/admin/categories/:id"}, "properties": {"repobilityId": "29fa5dee3d64f5c2", "scanner": "scanner-primary", "fingerprint": "db2990b300f8c8fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5488f68f1e917210", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/categories/:id"}, "properties": {"repobilityId": "de6945e8ef778cfd", "scanner": "scanner-primary", "fingerprint": "5488f68f1e917210", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4d87f54d62a1386", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/users"}, "properties": {"repobilityId": "c3ced27d0a5eecca", "scanner": "scanner-primary", "fingerprint": "b4d87f54d62a1386", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00f2e5ab41a67cee", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/line/reset-all"}, "properties": {"repobilityId": "1e970fb30d8d1a51", "scanner": "scanner-primary", "fingerprint": "00f2e5ab41a67cee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db664069e05b68b9", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/admin/users/:id/role"}, "properties": {"repobilityId": "8f2f5907c4e292af", "scanner": "scanner-primary", "fingerprint": "db664069e05b68b9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2177c20b49eec710", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/admin/users/:id"}, "properties": {"repobilityId": "0d21dac535892d8d", "scanner": "scanner-primary", "fingerprint": "2177c20b49eec710", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-423994969f2da2fc", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/users/:id/archive"}, "properties": {"repobilityId": "c3a1c7b90e96a87b", "scanner": "scanner-primary", "fingerprint": "423994969f2da2fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee20c9bfd2d3fb52", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/users/:id/restore"}, "properties": {"repobilityId": "d07009851437b296", "scanner": "scanner-primary", "fingerprint": "ee20c9bfd2d3fb52", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41a4ed01d7141fb5", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/coaches/account"}, "properties": {"repobilityId": "455226bcc0b1249a", "scanner": "scanner-primary", "fingerprint": "41a4ed01d7141fb5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-504897b15cd9aa17", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/coaches"}, "properties": {"repobilityId": "462fd8bd78e4ebed", "scanner": "scanner-primary", "fingerprint": "504897b15cd9aa17", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-73f63bc10c65f3ad", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/admin/coaches/:id"}, "properties": {"repobilityId": "327ab05a92b8777b", "scanner": "scanner-primary", "fingerprint": "73f63bc10c65f3ad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-497859f0dbf33679", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/coaches/:id"}, "properties": {"repobilityId": "e67aae35cfc6344b", "scanner": "scanner-primary", "fingerprint": "497859f0dbf33679", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bbcfdeb8ab466973", "level": "note", "message": {"text": "Unused endpoint: GET /api/coach/me"}, "properties": {"repobilityId": "57dd951785e725df", "scanner": "scanner-primary", "fingerprint": "bbcfdeb8ab466973", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c980da79507c3c3", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/coach/me/profile"}, "properties": {"repobilityId": "e5bdc55b5c757945", "scanner": "scanner-primary", "fingerprint": "4c980da79507c3c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff52be2a859e9a56", "level": "note", "message": {"text": "Unused endpoint: GET /api/coach/me/rules"}, "properties": {"repobilityId": "418f2f9996ead34e", "scanner": "scanner-primary", "fingerprint": "ff52be2a859e9a56", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e8326c2d77460680", "level": "note", "message": {"text": "Unused endpoint: POST /api/coach/me/rules"}, "properties": {"repobilityId": "d9dfbcb32938557d", "scanner": "scanner-primary", "fingerprint": "e8326c2d77460680", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c36c18525b6f966a", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/coach/me/rules/:id"}, "properties": {"repobilityId": "fbd0085c8a93038f", "scanner": "scanner-primary", "fingerprint": "c36c18525b6f966a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-edc3d4b5ce592aad", "level": "note", "message": {"text": "Unused endpoint: GET /api/coach/me/exceptions"}, "properties": {"repobilityId": "16bb92c877af32ab", "scanner": "scanner-primary", "fingerprint": "edc3d4b5ce592aad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d506cdddf6fbc17", "level": "note", "message": {"text": "Unused endpoint: POST /api/coach/me/exceptions"}, "properties": {"repobilityId": "a248c3823e8608d6", "scanner": "scanner-primary", "fingerprint": "0d506cdddf6fbc17", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53bfcf48682a22b7", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/coach/me/exceptions/:id"}, "properties": {"repobilityId": "a8258114c50d7a0e", "scanner": "scanner-primary", "fingerprint": "53bfcf48682a22b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5c1b83bc540590b", "level": "note", "message": {"text": "Unused endpoint: GET /api/coach/me/bookings"}, "properties": {"repobilityId": "d3ff1f5bf57af3f2", "scanner": "scanner-primary", "fingerprint": "d5c1b83bc540590b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1601be44ecdf7d7c", "level": "note", "message": {"text": "Unused endpoint: GET /api/coach/me/availability-preview"}, "properties": {"repobilityId": "10f5a144fac8d6a1", "scanner": "scanner-primary", "fingerprint": "1601be44ecdf7d7c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bad986b44e3e9f0a", "level": "note", "message": {"text": "Unused endpoint: POST /api/coach/me/avatar"}, "properties": {"repobilityId": "e8108d48b9559c92", "scanner": "scanner-primary", "fingerprint": "bad986b44e3e9f0a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}