{"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-132c56c769e99e5c", "name": "Stray `console.log` in TS/JS \u2014 scripts/booking-blvd-ownership-e2e.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/booking-blvd-ownership-e2e.ts:60"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d82a1d8c0a6e87ea", "name": "Stray `console.log` in TS/JS \u2014 scripts/process-flat.ts:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/process-flat.ts:145"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a85c91a1a7edc0e", "name": "Stray `console.log` in TS/JS \u2014 scripts/posthog-sync.ts:404", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/posthog-sync.ts:404"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1dae46f2ef384b2a", "name": "Stray `console.log` in TS/JS \u2014 scripts/blvd-import-revenue.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/blvd-import-revenue.ts:56"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-31e3bc830c750427", "name": "Stray `console.log` in TS/JS \u2014 scripts/restructure-content.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/restructure-content.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cee3b28a74570580", "name": "Stray `console.log` in TS/JS \u2014 scripts/posthog-sync-callrail-conversions.ts:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/posthog-sync-callrail-conversions.ts:107"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7612f8a949e48e7a", "name": "Stray `console.log` in TS/JS \u2014 scripts/push-secrets.ts:232", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/push-secrets.ts:232"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f590a4f88b9b64e1", "name": "Stray `console.log` in TS/JS \u2014 scripts/retell-create-booking-agent.ts:410", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/retell-create-booking-agent.ts:410"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-13a7c98dd01a3dd8", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-hero-dirs.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-hero-dirs.ts:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa0ab475c863ffeb", "name": "Stray `console.log` in TS/JS \u2014 scripts/archive-processing-images.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/archive-processing-images.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f0aa8aa3cfe13653", "name": "Stray `console.log` in TS/JS \u2014 scripts/blvd-project-weekly-revenue.ts:209", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/blvd-project-weekly-revenue.ts:209"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c7af68711a947070", "name": "Stray `console.log` in TS/JS \u2014 scripts/distribute-candidates.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/distribute-candidates.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7744131a1168a4ba", "name": "Stray `console.log` in TS/JS \u2014 scripts/clear-reviews.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clear-reviews.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-3b3f4189fb2bd608", "name": "Stray `console.log` in TS/JS \u2014 scripts/blvd-sync-revenue.ts:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/blvd-sync-revenue.ts:98"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f17446fce7c0b2f", "name": "Stray `console.log` in TS/JS \u2014 scripts/crop-flat.ts:150", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/crop-flat.ts:150"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bfc81bd303230fdc", "name": "Stray `console.log` in TS/JS \u2014 scripts/extract-content.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-content.ts:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3a149a598fe7af02", "name": "Stray `console.log` in TS/JS \u2014 scripts/retell-agent2agent-test.ts:1161", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/retell-agent2agent-test.ts:1161"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e85b3e1887ca70c3", "name": "Stray `console.log` in TS/JS \u2014 scripts/fetch-reviews.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fetch-reviews.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dbbb7254030940fa", "name": "Stray `console.log` in TS/JS \u2014 scripts/retell-deploy-booking-agents.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/retell-deploy-booking-agents.ts:78"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-234f91921e3831a8", "name": "Stray `console.log` in TS/JS \u2014 scripts/retell-booking-dev.ts:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/retell-booking-dev.ts:82"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05e4641d3bf5b2d4", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-images.ts:324", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-images.ts:324"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a762f7aa6330e9cd", "name": "Stray `console.log` in TS/JS \u2014 scripts/booking-phone-verification-e2e.ts:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/booking-phone-verification-e2e.ts:84"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f13ac3228dcc12f", "name": "Stray `console.log` in TS/JS \u2014 scripts/posthog-booking-errors.ts:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/posthog-booking-errors.ts:127"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-13aec306fb085e7d", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-hero-images.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-hero-images.ts:73"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-14e5f2fac2b4d53a", "name": "Stray `console.log` in TS/JS \u2014 scripts/ga4-sync-callrail-conversions.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ga4-sync-callrail-conversions.ts:93"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f5d875ac2f29dba8", "name": "Stray `console.log` in TS/JS \u2014 scripts/fetch-reviews.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fetch-reviews.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dc305562c0573566", "name": "Stray `console.log` in TS/JS \u2014 scripts/scrape-before-after.ts:659", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scrape-before-after.ts:659"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c52737dc036f3c3e", "name": "Stray `console.log` in TS/JS \u2014 scripts/redistribute-hero-images.ts:164", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/redistribute-hero-images.ts:164"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05ec33976cb673e0", "name": "Stray `console.log` in TS/JS \u2014 scripts/trim-images.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/trim-images.ts:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8119ea53dd69e52f", "name": "Stray `console.log` in TS/JS \u2014 scripts/blvd-reconcile-revenue.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/blvd-reconcile-revenue.ts:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e7899ddbbcf9e1f", "name": "TODO/FIXME marker in shipping code \u2014 scripts/utils/monitoring.ts:14", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/utils/monitoring.ts:14"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-414bbec74e82f1ac", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e38e2836406c332e", "name": "Stray `console.log` in TS/JS \u2014 prisma/make-admin.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/make-admin.ts:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-619ba18d780c9d49", "name": "Stray `console.log` in TS/JS \u2014 prisma/script.ts:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/script.ts:4"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee0efbdf42016c32", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed/users.ts:87", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed/users.ts:87"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d017ab56160d968f", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed/services.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed/services.ts:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e1e908a4b2b1e6b", "name": "Stray `console.log` in TS/JS \u2014 google-ads/scripts/upload-assets.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 google-ads/scripts/upload-assets.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-25ab3fb6c8a7991f", "name": "Stray `console.log` in TS/JS \u2014 google-ads/scripts/sync.js:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 google-ads/scripts/sync.js:82"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-89e279c6f80ea48b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/root.tsx:272", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/root.tsx:272"}, "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-4afce67f59d0bac1", "name": "TODO/FIXME marker in shipping code \u2014 app/utils/monitoring.server.ts:13", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/utils/monitoring.server.ts:13"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a5fe348127d664d", "name": "Stray `console.log` in TS/JS \u2014 app/utils/background-jobs.server.ts:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/utils/background-jobs.server.ts:95"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b67eda79761cb9d8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/utils/client-hints.tsx:46", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/utils/client-hints.tsx:46"}, "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-c7b5aa5a6b4786c5", "name": "Stray `console.log` in TS/JS \u2014 app/utils/client.server.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/utils/client.server.ts:65"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbfdd44949fcdd73", "name": "Stray `console.log` in TS/JS \u2014 app/utils/sms.server.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/utils/sms.server.ts:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-213c80bb3c9753b0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/routes/_services+/__service-layout.tsx:35", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/routes/_services+/__service-layout.tsx:35"}, "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-786ee9e2845c44b4", "name": "Stray `console.log` in TS/JS \u2014 app/routes/admin+/reviews.tsx:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/routes/admin+/reviews.tsx:79"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-edd9c8b1bb9cc464", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/routes/_marketing+/bearden.tsx:72", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/routes/_marketing+/bearden.tsx:72"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b14ba62db385fd97", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/routes/_marketing+/farragut.tsx:73", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/routes/_marketing+/farragut.tsx:73"}, "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-61a40c5019973ade", "name": "Stray `console.log` in TS/JS \u2014 app/routes/resources+/healthcheck.tsx:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/routes/resources+/healthcheck.tsx: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-4a45d4d21f523ec5", "name": "Stray `console.log` in TS/JS \u2014 app/routes/account+/info+/$slug.tsx:419", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/routes/account+/info+/$slug.tsx:419"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36db4c2899283b41", "name": "Stray `console.log` in TS/JS \u2014 server/index.ts:300", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/index.ts:300"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb4e9ce8fc938d7d", "name": "Stray `console.log` in TS/JS \u2014 other/setup-swap.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 other/setup-swap.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-f5ca8eaf21fd7653", "name": "Stray `console.log` in TS/JS \u2014 other/build-server.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 other/build-server.ts:30"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-946d3772988dbaf8", "name": "Stray `console.log` in TS/JS \u2014 other/build-icons.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 other/build-icons.ts:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7560861370b89999", "name": "Dockerfile runs as root: other/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: other/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-6f9da1218eef4fa5", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-821c0ccfc9944cfe", "name": "Insecure pattern 'node_child_process' in scripts/process-flat.ts:40", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/process-flat.ts:40"}, "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-435fadab74053faf", "name": "Insecure pattern 'node_child_process' in scripts/push-secrets.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/push-secrets.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8febf2607dbf96df", "name": "Insecure pattern 'node_child_process' in scripts/retell-deploy-booking-agents.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/retell-deploy-booking-agents.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8209f17a6f54cb0d", "name": "Insecure pattern 'node_child_process' in scripts/retell-booking-dev.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/retell-booking-dev.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3188c8485554b8bf", "name": "Insecure pattern 'node_child_process' in scripts/generate-images.ts:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/generate-images.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c544fdb6b178fb2f", "name": "Insecure pattern 'node_child_process' in scripts/scrape-before-after.ts:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/scrape-before-after.ts:16"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ce243e7e316d11aa", "name": "Insecure pattern 'node_child_process' in prisma/seed.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in prisma/seed.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9b1657e6feab3f0e", "name": "Insecure pattern 'dangerous_innerhtml' in app/root.tsx:272", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/root.tsx:272"}, "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-81339df1b7d7a868", "name": "Insecure pattern 'node_child_process' in app/utils/background-jobs.server.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in app/utils/background-jobs.server.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b666ecadf6cc292d", "name": "Insecure pattern 'dangerous_innerhtml' in app/utils/client-hints.tsx:46", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/utils/client-hints.tsx:46"}, "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-d7352e298b7b5d35", "name": "Insecure pattern 'dangerous_innerhtml' in app/routes/_services+/__service-layout.tsx:35", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/routes/_services+/__service-layout.tsx:35"}, "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-1ae427e2f093806d", "name": "Insecure pattern 'node_child_process' in app/routes/admin+/google-ads.tsx:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in app/routes/admin+/google-ads.tsx:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf6787909d451810", "name": "Insecure pattern 'dangerous_innerhtml' in app/routes/_marketing+/bearden.tsx:72", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/routes/_marketing+/bearden.tsx:72"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9e169bafc63c1779", "name": "Insecure pattern 'dangerous_innerhtml' in app/routes/_marketing+/farragut.tsx:73", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/routes/_marketing+/farragut.tsx:73"}, "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-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d359b89ac60c6ce", "name": "Very large file: scripts/retell-booking-agent-config.ts (1112 lines)", "shortDescription": {"text": "Very large file: scripts/retell-booking-agent-config.ts (1112 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-e65ba6583f9e120e", "name": "Very large file: app/utils/blvd-voice-booking.server.ts (2953 lines)", "shortDescription": {"text": "Very large file: app/utils/blvd-voice-booking.server.ts (2953 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-49d578fe21b2fa15", "name": "Very large file: app/routes/book.tsx (4995 lines)", "shortDescription": {"text": "Very large file: app/routes/book.tsx (4995 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-eb5625e20b437b9d", "name": "Very large file: app/routes/lp+/jeuveau.tsx (1497 lines)", "shortDescription": {"text": "Very large file: app/routes/lp+/jeuveau.tsx (1497 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-67645c37d5126560", "name": "Very large file: app/routes/lp+/kybella.tsx (1497 lines)", "shortDescription": {"text": "Very large file: app/routes/lp+/kybella.tsx (1497 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-9913fb2208de6591", "name": "Very large file: app/routes/lp+/botox.tsx (2467 lines)", "shortDescription": {"text": "Very large file: app/routes/lp+/botox.tsx (2467 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-859df37a891ff4f7", "name": "Very large file: app/routes/lp+/dysport.tsx (1497 lines)", "shortDescription": {"text": "Very large file: app/routes/lp+/dysport.tsx (1497 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-5d2b5d1358b13428", "name": "Very large file: app/routes/lp+/lip-filler.tsx (1500 lines)", "shortDescription": {"text": "Very large file: app/routes/lp+/lip-filler.tsx (1500 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-402e9151eff05a03", "name": "Very large file: app/routes/lp+/lip-flip.tsx (1497 lines)", "shortDescription": {"text": "Very large file: app/routes/lp+/lip-flip.tsx (1497 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "39 tests / 270 src (ratio 0.14)."}, "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 372 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 21 placeholder/mock markers across 9 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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b36ce915642e22a7", "name": "Commented-code block (5 lines) in tests/e2e/note-images.test.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/e2e/note-images.test.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c4103ac073c8114", "name": "Commented-code block (5 lines) in tests/e2e/onboarding.test.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/e2e/onboarding.test.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-698a6aec79bc17aa", "name": "Commented-code block (6 lines) in tests/e2e/settings-profile.test.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/e2e/settings-profile.test.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30d8f1e3d59646bd", "name": "Commented-code block (7 lines) in tests/e2e/2fa.test.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in tests/e2e/2fa.test.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d20ff9cb0e1d17c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/booking-blvd-ownership-e2e.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/booking-blvd-ownership-e2e.ts:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-52f0ab7e0ff29be8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/posthog-sync.ts:352", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/posthog-sync.ts:352"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-da0615a0214d6310", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-reviews.ts:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-reviews.ts:71"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb0b564c9eb9d36d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/retell-booking-dev.ts:636", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/retell-booking-dev.ts:636"}, "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-1c0e6cb9e5083357", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-images.ts:353", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-images.ts:353"}, "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-3bcb1523d5841bac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/booking-phone-verification-e2e.ts:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/booking-phone-verification-e2e.ts:64"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d0347cc986d7754", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/posthog-booking-errors.ts:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/posthog-booking-errors.ts:101"}, "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-385b21ba7de74722", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-reviews.js:542", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-reviews.js:542"}, "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-1a38af9773d689d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/scrape-before-after.ts:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/scrape-before-after.ts:132"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf0d2c18de9943e8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/blvd-admin.server.ts:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/blvd-admin.server.ts:77"}, "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-474b2a41f5ca5db7", "name": "Commented-code block (5 lines) in app/utils/stepper.tsx:142", "shortDescription": {"text": "Commented-code block (5 lines) in app/utils/stepper.tsx:142"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-462e9233a084ee97", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/booking-analytics.ts:413", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/booking-analytics.ts:413"}, "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-d6450225df49be88", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/email.server.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/email.server.ts:53"}, "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-d8018c88610602b0", "name": "Commented-code block (5 lines) in app/utils/content-loader.server.ts:440", "shortDescription": {"text": "Commented-code block (5 lines) in app/utils/content-loader.server.ts:440"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eff315d537033c58", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/blvd-voice-booking.server.ts:1639", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/blvd-voice-booking.server.ts:1639"}, "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-4a150d062942379a", "name": "Legacy-named symbol `event_too_old` in app/utils/ga4-measurement-protocol.server.test.ts:89", "shortDescription": {"text": "Legacy-named symbol `event_too_old` in app/utils/ga4-measurement-protocol.server.test.ts:89"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06889ecd5ed8bdab", "name": "Commented-code block (6 lines) in app/utils/posthog-booking-identity.ts:31", "shortDescription": {"text": "Commented-code block (6 lines) in app/utils/posthog-booking-identity.ts:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-467cf0055fedf593", "name": "Commented-code block (12 lines) in app/utils/client.server.ts:65", "shortDescription": {"text": "Commented-code block (12 lines) in app/utils/client.server.ts:65"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-076bf262efbea24a", "name": "Legacy-named symbol `event_too_old` in app/utils/ga4-measurement-protocol.server.ts:47", "shortDescription": {"text": "Legacy-named symbol `event_too_old` in app/utils/ga4-measurement-protocol.server.ts:47"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7a9dfd8cc0b759f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/routes/cache+/cache_.sqlite.server.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/routes/cache+/cache_.sqlite.server.ts:21"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1662ae7a5bb4e048", "name": "33 env vars used in code but missing from .env.example", "shortDescription": {"text": "33 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CANDIDATES_DIR`, `CI`, `COMMIT_SHA`, `CONCURRENCY`, `ENABLE_DEV_POSTHOG`, `FLY_APP_NAME`, `FLY_REGION`, `GA_TRACKING_ID` + 25 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-e89fa2d168dda711", "name": "Dangling fetch: GET http://127.0.0.1:4040/api/tunnels (scripts/retell-booking-dev.ts:838)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:4040/api/tunnels (scripts/retell-booking-dev.ts:838)"}, "fullDescription": {"text": "`scripts/retell-booking-dev.ts:838` calls `GET http://127.0.0.1:4040/api/tunnels` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:4040/api/tunnels`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3908d9695d99bff1", "name": "Dangling fetch: GET https://api.retellai.com${path} (scripts/retell-booking-dev.ts:874)", "shortDescription": {"text": "Dangling fetch: GET https://api.retellai.com${path} (scripts/retell-booking-dev.ts:874)"}, "fullDescription": {"text": "`scripts/retell-booking-dev.ts:874` calls `GET https://api.retellai.com${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.retellai.com/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8c89eaa85e3e8905", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (scripts/generate-images.ts:353)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (scripts/generate-images.ts:353)"}, "fullDescription": {"text": "`scripts/generate-images.ts:353` calls `POST https://openrouter.ai/api/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec1df9e39a83e889", "name": "Dangling fetch: GET https://dashboard.boulevard.io/api/2020-01/admin (app/utils/blvd-admin.server.ts:77)", "shortDescription": {"text": "Dangling fetch: GET https://dashboard.boulevard.io/api/2020-01/admin (app/utils/blvd-admin.server.ts:77)"}, "fullDescription": {"text": "`app/utils/blvd-admin.server.ts:77` calls `GET https://dashboard.boulevard.io/api/2020-01/admin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashboard.boulevard.io/api/2020-01/admin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37ae12a833b474c1", "name": "Dangling fetch: POST /resources/call-tracking-attribution (app/utils/booking-analytics.ts:413)", "shortDescription": {"text": "Dangling fetch: POST /resources/call-tracking-attribution (app/utils/booking-analytics.ts:413)"}, "fullDescription": {"text": "`app/utils/booking-analytics.ts:413` calls `POST /resources/call-tracking-attribution` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/resources/call-tracking-attribution`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc43b43c32f8fa64", "name": "Dangling fetch: POST https://api.resend.com/emails (app/utils/email.server.ts:53)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (app/utils/email.server.ts:53)"}, "fullDescription": {"text": "`app/utils/email.server.ts:53` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-25fbc1973367efc8", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (app/utils/follow-ups.server.ts:175)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (app/utils/follow-ups.server.ts:175)"}, "fullDescription": {"text": "`app/utils/follow-ups.server.ts:175` 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-2a20baa499851ffc", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (app/utils/follow-ups.server.ts:245)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (app/utils/follow-ups.server.ts:245)"}, "fullDescription": {"text": "`app/utils/follow-ups.server.ts:245` 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-f70ad06dfd1f9a05", "name": "Dangling fetch: GET https://dashboard.boulevard.io/api/2020-01/admin (app/utils/blvd-voice-booking.server.ts:1639)", "shortDescription": {"text": "Dangling fetch: GET https://dashboard.boulevard.io/api/2020-01/admin (app/utils/blvd-voice-booking.server.ts:1639)"}, "fullDescription": {"text": "`app/utils/blvd-voice-booking.server.ts:1639` calls `GET https://dashboard.boulevard.io/api/2020-01/admin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashboard.boulevard.io/api/2020-01/admin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-60ec91a5e989bfa4", "name": "Dangling fetch: POST /resources/blvd-attribution (app/routes/book.tsx:4482)", "shortDescription": {"text": "Dangling fetch: POST /resources/blvd-attribution (app/routes/book.tsx:4482)"}, "fullDescription": {"text": "`app/routes/book.tsx:4482` calls `POST /resources/blvd-attribution` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/resources/blvd-attribution`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1e21473ff863d60f", "name": "Dangling fetch: POST /resources/blvd-booking-intent (app/routes/book.tsx:4509)", "shortDescription": {"text": "Dangling fetch: POST /resources/blvd-booking-intent (app/routes/book.tsx:4509)"}, "fullDescription": {"text": "`app/routes/book.tsx:4509` calls `POST /resources/blvd-booking-intent` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/resources/blvd-booking-intent`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc2c8e60065e9915", "name": "Dangling fetch: POST /resources/booking-phone-verification (app/routes/book.tsx:4565)", "shortDescription": {"text": "Dangling fetch: POST /resources/booking-phone-verification (app/routes/book.tsx:4565)"}, "fullDescription": {"text": "`app/routes/book.tsx:4565` calls `POST /resources/booking-phone-verification` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/resources/booking-phone-verification`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c1799dcbf52dbaef", "name": "Dangling fetch: GET /resources/booking-client-lookup (app/routes/book.tsx:4588)", "shortDescription": {"text": "Dangling fetch: GET /resources/booking-client-lookup (app/routes/book.tsx:4588)"}, "fullDescription": {"text": "`app/routes/book.tsx:4588` calls `GET /resources/booking-client-lookup` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/resources/booking-client-lookup`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3b59435b3211a9df", "name": "Unused endpoint: USE /assets", "shortDescription": {"text": "Unused endpoint: USE /assets"}, "fullDescription": {"text": "`server/index.ts` declares `USE /assets` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23736"}, "properties": {"repository": "zwhitchcox/hitchcoxaesthetics.com", "repoUrl": "https://github.com/zwhitchcox/hitchcoxaesthetics.com", "branch": "main"}, "results": [{"ruleId": "scanner-132c56c769e99e5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/booking-blvd-ownership-e2e.ts:60"}, "properties": {"repobilityId": "52020bfdc4cfe527", "scanner": "scanner-primary", "fingerprint": "132c56c769e99e5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d82a1d8c0a6e87ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/process-flat.ts:145"}, "properties": {"repobilityId": "36fa18ec4494e003", "scanner": "scanner-primary", "fingerprint": "d82a1d8c0a6e87ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1a85c91a1a7edc0e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/posthog-sync.ts:404"}, "properties": {"repobilityId": "5015687ad6db36d1", "scanner": "scanner-primary", "fingerprint": "1a85c91a1a7edc0e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1dae46f2ef384b2a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/blvd-import-revenue.ts:56"}, "properties": {"repobilityId": "e425c00b14938dcb", "scanner": "scanner-primary", "fingerprint": "1dae46f2ef384b2a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31e3bc830c750427", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/restructure-content.ts:34"}, "properties": {"repobilityId": "0513eff8c52f4835", "scanner": "scanner-primary", "fingerprint": "31e3bc830c750427", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cee3b28a74570580", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/posthog-sync-callrail-conversions.ts:107"}, "properties": {"repobilityId": "91dcdbca933c8681", "scanner": "scanner-primary", "fingerprint": "cee3b28a74570580", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7612f8a949e48e7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/push-secrets.ts:232"}, "properties": {"repobilityId": "44938092a9802e44", "scanner": "scanner-primary", "fingerprint": "7612f8a949e48e7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f590a4f88b9b64e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/retell-create-booking-agent.ts:410"}, "properties": {"repobilityId": "5cb4d642353fac0b", "scanner": "scanner-primary", "fingerprint": "f590a4f88b9b64e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-13a7c98dd01a3dd8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-hero-dirs.ts:50"}, "properties": {"repobilityId": "d6b738d924992848", "scanner": "scanner-primary", "fingerprint": "13a7c98dd01a3dd8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa0ab475c863ffeb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/archive-processing-images.ts:41"}, "properties": {"repobilityId": "1cdef9373ba011c4", "scanner": "scanner-primary", "fingerprint": "aa0ab475c863ffeb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f0aa8aa3cfe13653", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/blvd-project-weekly-revenue.ts:209"}, "properties": {"repobilityId": "c4bc805bbb266c47", "scanner": "scanner-primary", "fingerprint": "f0aa8aa3cfe13653", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7af68711a947070", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/distribute-candidates.ts:34"}, "properties": {"repobilityId": "ab1751520fbdab69", "scanner": "scanner-primary", "fingerprint": "c7af68711a947070", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7744131a1168a4ba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clear-reviews.js:8"}, "properties": {"repobilityId": "7042215f0cbe0ca5", "scanner": "scanner-primary", "fingerprint": "7744131a1168a4ba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b3f4189fb2bd608", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/blvd-sync-revenue.ts:98"}, "properties": {"repobilityId": "30da31b642b6ee1f", "scanner": "scanner-primary", "fingerprint": "3b3f4189fb2bd608", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9f17446fce7c0b2f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/crop-flat.ts:150"}, "properties": {"repobilityId": "b5a8016c89f9b434", "scanner": "scanner-primary", "fingerprint": "9f17446fce7c0b2f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bfc81bd303230fdc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-content.ts:27"}, "properties": {"repobilityId": "945463463615a0b0", "scanner": "scanner-primary", "fingerprint": "bfc81bd303230fdc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3a149a598fe7af02", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/retell-agent2agent-test.ts:1161"}, "properties": {"repobilityId": "d924c41fdd299cf7", "scanner": "scanner-primary", "fingerprint": "3a149a598fe7af02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e85b3e1887ca70c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fetch-reviews.ts:13"}, "properties": {"repobilityId": "96b3ecc98ebf0283", "scanner": "scanner-primary", "fingerprint": "e85b3e1887ca70c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dbbb7254030940fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/retell-deploy-booking-agents.ts:78"}, "properties": {"repobilityId": "4164f91677a8341d", "scanner": "scanner-primary", "fingerprint": "dbbb7254030940fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-234f91921e3831a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/retell-booking-dev.ts:82"}, "properties": {"repobilityId": "3c3c821a035cd058", "scanner": "scanner-primary", "fingerprint": "234f91921e3831a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-05e4641d3bf5b2d4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-images.ts:324"}, "properties": {"repobilityId": "304147879454f2f3", "scanner": "scanner-primary", "fingerprint": "05e4641d3bf5b2d4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a762f7aa6330e9cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/booking-phone-verification-e2e.ts:84"}, "properties": {"repobilityId": "e54f9d43d9eafa96", "scanner": "scanner-primary", "fingerprint": "a762f7aa6330e9cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f13ac3228dcc12f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/posthog-booking-errors.ts:127"}, "properties": {"repobilityId": "b8863e22f4f53a4e", "scanner": "scanner-primary", "fingerprint": "1f13ac3228dcc12f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-13aec306fb085e7d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-hero-images.ts:73"}, "properties": {"repobilityId": "bb3119b760676ab1", "scanner": "scanner-primary", "fingerprint": "13aec306fb085e7d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14e5f2fac2b4d53a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ga4-sync-callrail-conversions.ts:93"}, "properties": {"repobilityId": "767d83521814c758", "scanner": "scanner-primary", "fingerprint": "14e5f2fac2b4d53a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5d875ac2f29dba8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fetch-reviews.js:41"}, "properties": {"repobilityId": "79c83f5827f0a15b", "scanner": "scanner-primary", "fingerprint": "f5d875ac2f29dba8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dc305562c0573566", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scrape-before-after.ts:659"}, "properties": {"repobilityId": "cd6a54acaa1cb628", "scanner": "scanner-primary", "fingerprint": "dc305562c0573566", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c52737dc036f3c3e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/redistribute-hero-images.ts:164"}, "properties": {"repobilityId": "d3ed2f40419300a0", "scanner": "scanner-primary", "fingerprint": "c52737dc036f3c3e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-05ec33976cb673e0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/trim-images.ts:40"}, "properties": {"repobilityId": "ba26325603befa48", "scanner": "scanner-primary", "fingerprint": "05ec33976cb673e0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8119ea53dd69e52f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/blvd-reconcile-revenue.ts:32"}, "properties": {"repobilityId": "46bae3e748fd0c74", "scanner": "scanner-primary", "fingerprint": "8119ea53dd69e52f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e7899ddbbcf9e1f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/utils/monitoring.ts:14"}, "properties": {"repobilityId": "c5638a91e27ed2c6", "scanner": "scanner-primary", "fingerprint": "3e7899ddbbcf9e1f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-414bbec74e82f1ac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:17"}, "properties": {"repobilityId": "f77d7e0fb34b08e2", "scanner": "scanner-primary", "fingerprint": "414bbec74e82f1ac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e38e2836406c332e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/make-admin.ts:12"}, "properties": {"repobilityId": "5a2c901b035da142", "scanner": "scanner-primary", "fingerprint": "e38e2836406c332e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-619ba18d780c9d49", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/script.ts:4"}, "properties": {"repobilityId": "37a2adce1958acc1", "scanner": "scanner-primary", "fingerprint": "619ba18d780c9d49", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ee0efbdf42016c32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed/users.ts:87"}, "properties": {"repobilityId": "a4115fc79217264c", "scanner": "scanner-primary", "fingerprint": "ee0efbdf42016c32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d017ab56160d968f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed/services.ts:62"}, "properties": {"repobilityId": "1e92fce0bee2af3b", "scanner": "scanner-primary", "fingerprint": "d017ab56160d968f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8e1e908a4b2b1e6b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 google-ads/scripts/upload-assets.js:41"}, "properties": {"repobilityId": "afb99e1a83213173", "scanner": "scanner-primary", "fingerprint": "8e1e908a4b2b1e6b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25ab3fb6c8a7991f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 google-ads/scripts/sync.js:82"}, "properties": {"repobilityId": "fdc51ae09c79df95", "scanner": "scanner-primary", "fingerprint": "25ab3fb6c8a7991f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-89e279c6f80ea48b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/root.tsx:272"}, "properties": {"repobilityId": "d3f28b65f714df42", "scanner": "scanner-primary", "fingerprint": "89e279c6f80ea48b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4afce67f59d0bac1", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/utils/monitoring.server.ts:13"}, "properties": {"repobilityId": "7de91a995a7fe616", "scanner": "scanner-primary", "fingerprint": "4afce67f59d0bac1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3a5fe348127d664d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/utils/background-jobs.server.ts:95"}, "properties": {"repobilityId": "c5646059fe3a9d89", "scanner": "scanner-primary", "fingerprint": "3a5fe348127d664d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b67eda79761cb9d8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/utils/client-hints.tsx:46"}, "properties": {"repobilityId": "f244d1d733ceaf9f", "scanner": "scanner-primary", "fingerprint": "b67eda79761cb9d8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c7b5aa5a6b4786c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/utils/client.server.ts:65"}, "properties": {"repobilityId": "1f91a023955e1a5d", "scanner": "scanner-primary", "fingerprint": "c7b5aa5a6b4786c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bbfdd44949fcdd73", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/utils/sms.server.ts:12"}, "properties": {"repobilityId": "0daca04938f78b0d", "scanner": "scanner-primary", "fingerprint": "bbfdd44949fcdd73", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-213c80bb3c9753b0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/routes/_services+/__service-layout.tsx:35"}, "properties": {"repobilityId": "7fe345f534b76e1d", "scanner": "scanner-primary", "fingerprint": "213c80bb3c9753b0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-786ee9e2845c44b4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/routes/admin+/reviews.tsx:79"}, "properties": {"repobilityId": "e5ba206435f91cad", "scanner": "scanner-primary", "fingerprint": "786ee9e2845c44b4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-edd9c8b1bb9cc464", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/routes/_marketing+/bearden.tsx:72"}, "properties": {"repobilityId": "0a9415633efa97e9", "scanner": "scanner-primary", "fingerprint": "edd9c8b1bb9cc464", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b14ba62db385fd97", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/routes/_marketing+/farragut.tsx:73"}, "properties": {"repobilityId": "5095a9f1dbe4d84d", "scanner": "scanner-primary", "fingerprint": "b14ba62db385fd97", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-61a40c5019973ade", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/routes/resources+/healthcheck.tsx:23"}, "properties": {"repobilityId": "7de4d9b8657958d6", "scanner": "scanner-primary", "fingerprint": "61a40c5019973ade", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a45d4d21f523ec5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/routes/account+/info+/$slug.tsx:419"}, "properties": {"repobilityId": "6dd4ff851f9dcd56", "scanner": "scanner-primary", "fingerprint": "4a45d4d21f523ec5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36db4c2899283b41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/index.ts:300"}, "properties": {"repobilityId": "b4961a877930fd2f", "scanner": "scanner-primary", "fingerprint": "36db4c2899283b41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb4e9ce8fc938d7d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 other/setup-swap.js:6"}, "properties": {"repobilityId": "b09d5f88bb8e3a51", "scanner": "scanner-primary", "fingerprint": "bb4e9ce8fc938d7d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5ca8eaf21fd7653", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 other/build-server.ts:30"}, "properties": {"repobilityId": "dbecc2c1d0118f15", "scanner": "scanner-primary", "fingerprint": "f5ca8eaf21fd7653", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-946d3772988dbaf8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 other/build-icons.ts:23"}, "properties": {"repobilityId": "be0cd03230b2da75", "scanner": "scanner-primary", "fingerprint": "946d3772988dbaf8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7560861370b89999", "level": "warning", "message": {"text": "Dockerfile runs as root: other/Dockerfile"}, "properties": {"repobilityId": "38b2ae3ab7d734ed", "scanner": "scanner-primary", "fingerprint": "7560861370b89999", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-6f9da1218eef4fa5", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "properties": {"repobilityId": "d77ed51f510d31bf", "scanner": "scanner-primary", "fingerprint": "6f9da1218eef4fa5", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "other/Dockerfile"}, "region": {"startLine": 4}}}]}, {"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-821c0ccfc9944cfe", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/process-flat.ts:40"}, "properties": {"repobilityId": "aae7da073644d7f3", "scanner": "scanner-primary", "fingerprint": "821c0ccfc9944cfe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/process-flat.ts"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-435fadab74053faf", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/push-secrets.ts:1"}, "properties": {"repobilityId": "3be4a8c00f1ab153", "scanner": "scanner-primary", "fingerprint": "435fadab74053faf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/push-secrets.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8febf2607dbf96df", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/retell-deploy-booking-agents.ts:1"}, "properties": {"repobilityId": "b3374a03a1443317", "scanner": "scanner-primary", "fingerprint": "8febf2607dbf96df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/retell-deploy-booking-agents.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8209f17a6f54cb0d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/retell-booking-dev.ts:1"}, "properties": {"repobilityId": "1eb527fa648bdd5c", "scanner": "scanner-primary", "fingerprint": "8209f17a6f54cb0d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/retell-booking-dev.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3188c8485554b8bf", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/generate-images.ts:14"}, "properties": {"repobilityId": "161bcdfecadb5318", "scanner": "scanner-primary", "fingerprint": "3188c8485554b8bf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate-images.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-c544fdb6b178fb2f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/scrape-before-after.ts:16"}, "properties": {"repobilityId": "fc31dbc213082df6", "scanner": "scanner-primary", "fingerprint": "c544fdb6b178fb2f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/scrape-before-after.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-ce243e7e316d11aa", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in prisma/seed.ts:1"}, "properties": {"repobilityId": "8d1f43530fde189a", "scanner": "scanner-primary", "fingerprint": "ce243e7e316d11aa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prisma/seed.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9b1657e6feab3f0e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/root.tsx:272"}, "properties": {"repobilityId": "4e23d1962fdcfcfb", "scanner": "scanner-primary", "fingerprint": "9b1657e6feab3f0e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/root.tsx"}, "region": {"startLine": 272}}}]}, {"ruleId": "scanner-81339df1b7d7a868", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in app/utils/background-jobs.server.ts:1"}, "properties": {"repobilityId": "c15fd388186ba12d", "scanner": "scanner-primary", "fingerprint": "81339df1b7d7a868", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/utils/background-jobs.server.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b666ecadf6cc292d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/utils/client-hints.tsx:46"}, "properties": {"repobilityId": "8b32b93a7d4c315c", "scanner": "scanner-primary", "fingerprint": "b666ecadf6cc292d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/utils/client-hints.tsx"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-d7352e298b7b5d35", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/routes/_services+/__service-layout.tsx:35"}, "properties": {"repobilityId": "ba931b3e6c80c84a", "scanner": "scanner-primary", "fingerprint": "d7352e298b7b5d35", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routes/_services+/__service-layout.tsx"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-1ae427e2f093806d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in app/routes/admin+/google-ads.tsx:1"}, "properties": {"repobilityId": "fe45f30e87da474c", "scanner": "scanner-primary", "fingerprint": "1ae427e2f093806d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routes/admin+/google-ads.tsx"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cf6787909d451810", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/routes/_marketing+/bearden.tsx:72"}, "properties": {"repobilityId": "27edda325ae01b22", "scanner": "scanner-primary", "fingerprint": "cf6787909d451810", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routes/_marketing+/bearden.tsx"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-9e169bafc63c1779", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/routes/_marketing+/farragut.tsx:73"}, "properties": {"repobilityId": "49d815549878e918", "scanner": "scanner-primary", "fingerprint": "9e169bafc63c1779", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/routes/_marketing+/farragut.tsx"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2aee2e2d969c7c6b", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bee6b8956e03198c", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bacb3eb1f157784f", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2aee2e2d969c7c6b", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bee6b8956e03198c", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bacb3eb1f157784f", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2aee2e2d969c7c6b", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bee6b8956e03198c", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bacb3eb1f157784f", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2aee2e2d969c7c6b", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "506ba0b6ef99d92e", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "51525ad311ce9cb3", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 184}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bee6b8956e03198c", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 188}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bacb3eb1f157784f", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 194}}}]}, {"ruleId": "scanner-1d359b89ac60c6ce", "level": "note", "message": {"text": "Very large file: scripts/retell-booking-agent-config.ts (1112 lines)"}, "properties": {"repobilityId": "1b3077b39f663162", "scanner": "scanner-primary", "fingerprint": "1d359b89ac60c6ce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e65ba6583f9e120e", "level": "note", "message": {"text": "Very large file: app/utils/blvd-voice-booking.server.ts (2953 lines)"}, "properties": {"repobilityId": "d7e602f1aff5b701", "scanner": "scanner-primary", "fingerprint": "e65ba6583f9e120e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-49d578fe21b2fa15", "level": "note", "message": {"text": "Very large file: app/routes/book.tsx (4995 lines)"}, "properties": {"repobilityId": "d5a6a2ea9f2e4a0b", "scanner": "scanner-primary", "fingerprint": "49d578fe21b2fa15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb5625e20b437b9d", "level": "note", "message": {"text": "Very large file: app/routes/lp+/jeuveau.tsx (1497 lines)"}, "properties": {"repobilityId": "c9e040f482c0e446", "scanner": "scanner-primary", "fingerprint": "eb5625e20b437b9d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-67645c37d5126560", "level": "note", "message": {"text": "Very large file: app/routes/lp+/kybella.tsx (1497 lines)"}, "properties": {"repobilityId": "526e394cf07fa184", "scanner": "scanner-primary", "fingerprint": "67645c37d5126560", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9913fb2208de6591", "level": "note", "message": {"text": "Very large file: app/routes/lp+/botox.tsx (2467 lines)"}, "properties": {"repobilityId": "83750f79e7020a30", "scanner": "scanner-primary", "fingerprint": "9913fb2208de6591", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-859df37a891ff4f7", "level": "note", "message": {"text": "Very large file: app/routes/lp+/dysport.tsx (1497 lines)"}, "properties": {"repobilityId": "8709b608aee395a3", "scanner": "scanner-primary", "fingerprint": "859df37a891ff4f7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5d2b5d1358b13428", "level": "note", "message": {"text": "Very large file: app/routes/lp+/lip-filler.tsx (1500 lines)"}, "properties": {"repobilityId": "a992b2f73c0ffc00", "scanner": "scanner-primary", "fingerprint": "5d2b5d1358b13428", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-402e9151eff05a03", "level": "note", "message": {"text": "Very large file: app/routes/lp+/lip-flip.tsx (1497 lines)"}, "properties": {"repobilityId": "b3ea73015daa3715", "scanner": "scanner-primary", "fingerprint": "402e9151eff05a03", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "e45d8676bdf57d91", "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": "f134b79252485919", "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": "3dead2e318167cac", "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": "cdc65a90cab0a5be", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "ec411f35354e3ceb", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "9cedb89f73c84192", "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": "82b563cf8bde9add", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-b36ce915642e22a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/e2e/note-images.test.ts:1"}, "properties": {"repobilityId": "58a6824d4b35fc50", "scanner": "scanner-primary", "fingerprint": "b36ce915642e22a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c4103ac073c8114", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/e2e/onboarding.test.ts:1"}, "properties": {"repobilityId": "006aea91a51ee020", "scanner": "scanner-primary", "fingerprint": "9c4103ac073c8114", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-698a6aec79bc17aa", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/e2e/settings-profile.test.ts:1"}, "properties": {"repobilityId": "8ef3b337a26bad89", "scanner": "scanner-primary", "fingerprint": "698a6aec79bc17aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30d8f1e3d59646bd", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/e2e/2fa.test.ts:5"}, "properties": {"repobilityId": "cbf8be5bf9efbfb9", "scanner": "scanner-primary", "fingerprint": "30d8f1e3d59646bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d20ff9cb0e1d17c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/booking-blvd-ownership-e2e.ts:39"}, "properties": {"repobilityId": "0cb7cbba8e4b275c", "scanner": "scanner-primary", "fingerprint": "d20ff9cb0e1d17c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-52f0ab7e0ff29be8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/posthog-sync.ts:352"}, "properties": {"repobilityId": "f7d88c370ac0e420", "scanner": "scanner-primary", "fingerprint": "52f0ab7e0ff29be8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-da0615a0214d6310", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-reviews.ts:71"}, "properties": {"repobilityId": "1935987aa093a3d6", "scanner": "scanner-primary", "fingerprint": "da0615a0214d6310", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb0b564c9eb9d36d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/retell-booking-dev.ts:636"}, "properties": {"repobilityId": "090438ae42a81cd1", "scanner": "scanner-primary", "fingerprint": "eb0b564c9eb9d36d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1c0e6cb9e5083357", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-images.ts:353"}, "properties": {"repobilityId": "0486ad1edb095ae9", "scanner": "scanner-primary", "fingerprint": "1c0e6cb9e5083357", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3bcb1523d5841bac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/booking-phone-verification-e2e.ts:64"}, "properties": {"repobilityId": "03ddd271ed96f037", "scanner": "scanner-primary", "fingerprint": "3bcb1523d5841bac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d0347cc986d7754", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/posthog-booking-errors.ts:101"}, "properties": {"repobilityId": "b70b93117988fcfb", "scanner": "scanner-primary", "fingerprint": "3d0347cc986d7754", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-385b21ba7de74722", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-reviews.js:542"}, "properties": {"repobilityId": "f17087390bee8751", "scanner": "scanner-primary", "fingerprint": "385b21ba7de74722", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a38af9773d689d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/scrape-before-after.ts:132"}, "properties": {"repobilityId": "2b48e13646e382b2", "scanner": "scanner-primary", "fingerprint": "1a38af9773d689d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf0d2c18de9943e8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/blvd-admin.server.ts:77"}, "properties": {"repobilityId": "7cd80789dc619506", "scanner": "scanner-primary", "fingerprint": "cf0d2c18de9943e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-474b2a41f5ca5db7", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/utils/stepper.tsx:142"}, "properties": {"repobilityId": "be69c4e3c0f83e72", "scanner": "scanner-primary", "fingerprint": "474b2a41f5ca5db7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-462e9233a084ee97", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/booking-analytics.ts:413"}, "properties": {"repobilityId": "b1de8784fd508a25", "scanner": "scanner-primary", "fingerprint": "462e9233a084ee97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d6450225df49be88", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/email.server.ts:53"}, "properties": {"repobilityId": "0c65425fbb6c2cee", "scanner": "scanner-primary", "fingerprint": "d6450225df49be88", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d8018c88610602b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/utils/content-loader.server.ts:440"}, "properties": {"repobilityId": "f4a71605a46842d1", "scanner": "scanner-primary", "fingerprint": "d8018c88610602b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eff315d537033c58", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/utils/blvd-voice-booking.server.ts:1639"}, "properties": {"repobilityId": "305cb69f64ac1a03", "scanner": "scanner-primary", "fingerprint": "eff315d537033c58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4a150d062942379a", "level": "note", "message": {"text": "Legacy-named symbol `event_too_old` in app/utils/ga4-measurement-protocol.server.test.ts:89"}, "properties": {"repobilityId": "02dff2b1ba832099", "scanner": "scanner-primary", "fingerprint": "4a150d062942379a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-06889ecd5ed8bdab", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/utils/posthog-booking-identity.ts:31"}, "properties": {"repobilityId": "7116bd1bad69ce62", "scanner": "scanner-primary", "fingerprint": "06889ecd5ed8bdab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-467cf0055fedf593", "level": "none", "message": {"text": "Commented-code block (12 lines) in app/utils/client.server.ts:65"}, "properties": {"repobilityId": "2b944e4b6181186a", "scanner": "scanner-primary", "fingerprint": "467cf0055fedf593", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-076bf262efbea24a", "level": "note", "message": {"text": "Legacy-named symbol `event_too_old` in app/utils/ga4-measurement-protocol.server.ts:47"}, "properties": {"repobilityId": "a1d8370f7fab1210", "scanner": "scanner-primary", "fingerprint": "076bf262efbea24a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d7a9dfd8cc0b759f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/routes/cache+/cache_.sqlite.server.ts:21"}, "properties": {"repobilityId": "e2e261c9505c5c85", "scanner": "scanner-primary", "fingerprint": "d7a9dfd8cc0b759f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1662ae7a5bb4e048", "level": "note", "message": {"text": "33 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "90293c220e284644", "scanner": "scanner-primary", "fingerprint": "1662ae7a5bb4e048", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-e89fa2d168dda711", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:4040/api/tunnels (scripts/retell-booking-dev.ts:838)"}, "properties": {"repobilityId": "6de856995a8cba70", "scanner": "scanner-primary", "fingerprint": "e89fa2d168dda711", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3908d9695d99bff1", "level": "error", "message": {"text": "Dangling fetch: GET https://api.retellai.com${path} (scripts/retell-booking-dev.ts:874)"}, "properties": {"repobilityId": "5c92a61727b11f8d", "scanner": "scanner-primary", "fingerprint": "3908d9695d99bff1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8c89eaa85e3e8905", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (scripts/generate-images.ts:353)"}, "properties": {"repobilityId": "3755f026a9db1790", "scanner": "scanner-primary", "fingerprint": "8c89eaa85e3e8905", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ec1df9e39a83e889", "level": "error", "message": {"text": "Dangling fetch: GET https://dashboard.boulevard.io/api/2020-01/admin (app/utils/blvd-admin.server.ts:77)"}, "properties": {"repobilityId": "63036dc8637ccf48", "scanner": "scanner-primary", "fingerprint": "ec1df9e39a83e889", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-37ae12a833b474c1", "level": "error", "message": {"text": "Dangling fetch: POST /resources/call-tracking-attribution (app/utils/booking-analytics.ts:413)"}, "properties": {"repobilityId": "24f84f73bfebb0a2", "scanner": "scanner-primary", "fingerprint": "37ae12a833b474c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc43b43c32f8fa64", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (app/utils/email.server.ts:53)"}, "properties": {"repobilityId": "5021c5c814f7eda5", "scanner": "scanner-primary", "fingerprint": "bc43b43c32f8fa64", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-25fbc1973367efc8", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (app/utils/follow-ups.server.ts:175)"}, "properties": {"repobilityId": "d3bfc5fe025386e4", "scanner": "scanner-primary", "fingerprint": "25fbc1973367efc8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2a20baa499851ffc", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (app/utils/follow-ups.server.ts:245)"}, "properties": {"repobilityId": "706c86e4bd7e0349", "scanner": "scanner-primary", "fingerprint": "2a20baa499851ffc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f70ad06dfd1f9a05", "level": "error", "message": {"text": "Dangling fetch: GET https://dashboard.boulevard.io/api/2020-01/admin (app/utils/blvd-voice-booking.server.ts:1639)"}, "properties": {"repobilityId": "065a38ec13d77664", "scanner": "scanner-primary", "fingerprint": "f70ad06dfd1f9a05", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-60ec91a5e989bfa4", "level": "error", "message": {"text": "Dangling fetch: POST /resources/blvd-attribution (app/routes/book.tsx:4482)"}, "properties": {"repobilityId": "6c391bd52a930ac6", "scanner": "scanner-primary", "fingerprint": "60ec91a5e989bfa4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1e21473ff863d60f", "level": "error", "message": {"text": "Dangling fetch: POST /resources/blvd-booking-intent (app/routes/book.tsx:4509)"}, "properties": {"repobilityId": "68e37c83cf97f5a2", "scanner": "scanner-primary", "fingerprint": "1e21473ff863d60f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc2c8e60065e9915", "level": "error", "message": {"text": "Dangling fetch: POST /resources/booking-phone-verification (app/routes/book.tsx:4565)"}, "properties": {"repobilityId": "8a9b1f1ec15bb97f", "scanner": "scanner-primary", "fingerprint": "dc2c8e60065e9915", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c1799dcbf52dbaef", "level": "error", "message": {"text": "Dangling fetch: GET /resources/booking-client-lookup (app/routes/book.tsx:4588)"}, "properties": {"repobilityId": "feca2553970e018b", "scanner": "scanner-primary", "fingerprint": "c1799dcbf52dbaef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b59435b3211a9df", "level": "note", "message": {"text": "Unused endpoint: USE /assets"}, "properties": {"repobilityId": "5272fdc04a51dd35", "scanner": "scanner-primary", "fingerprint": "3b59435b3211a9df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}