{"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-c3b9ea725f7fcabc", "name": "Stray `console.log` in TS/JS \u2014 scripts/populate_firestore.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/populate_firestore.js:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cbe6dab6f7e998fd", "name": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/build-prompts.ts:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/build-prompts.ts:47"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-433d5dddb9f81f32", "name": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/scrub-narratives.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/scrub-narratives.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-2bc24b62314123bd", "name": "TODO/FIXME marker in shipping code \u2014 scripts/country-scout/run.ts:285", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/country-scout/run.ts:285"}, "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-bd8ed2d79105b397", "name": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/run.ts:269", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/run.ts:269"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a2b92f96eb418641", "name": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/merge-tournament-results.ts:321", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/merge-tournament-results.ts:321"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46eab1495b94833b", "name": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/apply-scout-deltas.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/apply-scout-deltas.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c8002b7c162d3c9", "name": "Stray `console.log` in TS/JS \u2014 website/js/main.js:167", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 website/js/main.js:167"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6beaa3c6447ebc78", "name": "Stray `console.log` in TS/JS \u2014 website/penalty-kick-game/assets/three-DBMlPueJ.js:1", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 website/penalty-kick-game/assets/three-DBMlPueJ.js:1"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4249ac4e6351c1dc", "name": "Stray `console.log` in TS/JS \u2014 src/screens/LoginScreen.tsx:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/LoginScreen.tsx:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a80625fc64800f6", "name": "Stray `console.log` in TS/JS \u2014 src/screens/FanSubscriptionScreen.tsx:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/FanSubscriptionScreen.tsx:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-350327a1e0f1fe52", "name": "Stray `console.log` in TS/JS \u2014 src/screens/SportsDataExample.tsx:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/SportsDataExample.tsx:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d271ddb51af23ee1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/screens/SportsDataExample.tsx:315", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/screens/SportsDataExample.tsx:315"}, "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-eed457c8052f9f9f", "name": "Stray `console.log` in TS/JS \u2014 src/screens/venue/VenueProfile.tsx:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/venue/VenueProfile.tsx: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-0aef234de52adf6d", "name": "Stray `console.log` in TS/JS \u2014 src/screens/venue/TestBilling.tsx:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/venue/TestBilling.tsx:5"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-843f8bb5934fbe95", "name": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-manager-photos.ts:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-manager-photos.ts:153"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e180ba4a21e62a1", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-utils.ts:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-utils.ts:124"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e50b6ec2317c329c", "name": "Stray `console.log` in TS/JS \u2014 functions/src/test-access.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/test-access.ts:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-66564aaa11ccfd6a", "name": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-manager-photos-v2.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-manager-photos-v2.ts:79"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c03e4c0743120cd", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-player-world-cup-stats.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-player-world-cup-stats.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76b0a4bfb7d00042", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-head-to-head.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-head-to-head.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f9f43559ac5b92d", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-all.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-all.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-5493be593ea60a8b", "name": "Stray `console.log` in TS/JS \u2014 functions/src/relink-photos-from-storage.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/relink-photos-from-storage.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-efdbfbb7805579bd", "name": "Stray `console.log` in TS/JS \u2014 functions/src/list-storage.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/list-storage.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f4ddf47ab16e226f", "name": "Stray `console.log` in TS/JS \u2014 functions/src/stripe-simple.ts:499", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/stripe-simple.ts:499"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3d7fe6b87248f5d", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-venue-enhancements.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-venue-enhancements.ts:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-01c183e928f38abe", "name": "Stray `console.log` in TS/JS \u2014 functions/src/check-photos.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/check-photos.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b46be1c367a877d2", "name": "Stray `console.log` in TS/JS \u2014 functions/src/upload-manager-photos.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/upload-manager-photos.ts:64"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-752cd0cd2323e5b9", "name": "Stray `console.log` in TS/JS \u2014 functions/src/add-mock-summaries.ts:168", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/add-mock-summaries.ts:168"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-69cc358ce1d06f32", "name": "Stray `console.log` in TS/JS \u2014 functions/src/relink-photos.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/relink-photos.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1eff1db8cc76dc78", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-june2026-matches.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-june2026-matches.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81be7a9cbe32f9e6", "name": "Stray `console.log` in TS/JS \u2014 functions/src/add-fra-eng-summary.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/add-fra-eng-summary.ts:92"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6666e9c9abed321f", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-world-cup-history.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-world-cup-history.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85a63652418ca38f", "name": "Stray `console.log` in TS/JS \u2014 functions/src/check-collections.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/check-collections.ts:35"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d323ec7f8211ffd", "name": "Stray `console.log` in TS/JS \u2014 functions/src/check-photos-v2.ts:87", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/check-photos-v2.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-52272c0dd6e10b27", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-managers.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-managers.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a7decd0bcbfb73f", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-team-players.ts:167", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-team-players.ts:167"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f94901cf0ba3db3d", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-match-summaries.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-match-summaries.ts:29"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8bacdd32d733fbf4", "name": "Stray `console.log` in TS/JS \u2014 functions/src/moderation-notifications.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/moderation-notifications.ts:49"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6e40f9057c11a8c", "name": "Stray `console.log` in TS/JS \u2014 functions/src/upload-missing-manager-photos.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/upload-missing-manager-photos.ts:55"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6e4155ebf4c3510b", "name": "Stray `console.log` in TS/JS \u2014 functions/src/check-match-times.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/check-match-times.ts:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5803865f3deae2ac", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-knockout-matches.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-knockout-matches.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbacd8f59b16e0d4", "name": "Stray `console.log` in TS/JS \u2014 functions/src/fix-match-times.ts:244", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fix-match-times.ts:244"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c4d278b7dcc7463", "name": "Stray `console.log` in TS/JS \u2014 functions/src/seed-match-narratives.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-match-narratives.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-6dcb2fe02831f0a5", "name": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-player-photos.ts:148", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-player-photos.ts:148"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e43f00e56c0d9692", "name": "Stray `console.log` in TS/JS \u2014 functions/src/upload-missing-photos.ts:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/upload-missing-photos.ts:130"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a4cd3a007746901f", "name": "Stray `console.log` in TS/JS \u2014 functions/src/live-score-sync.ts:614", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/live-score-sync.ts:614"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f813344ca159c3d", "name": "TODO/FIXME marker in shipping code \u2014 functions/src/generate-match-narratives.ts:625", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 functions/src/generate-match-narratives.ts:625"}, "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-7404c817769beec5", "name": "Stray `console.log` in TS/JS \u2014 functions/src/generate-match-narratives.ts:545", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/generate-match-narratives.ts:545"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b8a64a662d7fedf", "name": "Stray `console.log` in TS/JS \u2014 functions/src/photo-fetcher-utils.ts:568", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/photo-fetcher-utils.ts:568"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26e72ad796a7fc31", "name": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-player-photos-v2.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-player-photos-v2.ts:80"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ae6f88dd244fde0", "name": "Insecure pattern 'node_child_process' in scripts/country-scout/run.ts:25", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/country-scout/run.ts:25"}, "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-ff8edd575086b877", "name": "Insecure pattern 'direct_innerhtml_assignment' in website/js/main.js:72", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/js/main.js:72"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fd17c623ad17627a", "name": "Insecure pattern 'node_child_process' in functions/src/seed-all.ts:27", "shortDescription": {"text": "Insecure pattern 'node_child_process' in functions/src/seed-all.ts:27"}, "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-33f62be514886bbb", "name": "Insecure pattern 'cors_wildcard' in functions/__tests__/http-functions.test.ts:136", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in functions/__tests__/http-functions.test.ts:136"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e9b76aa2df7c78e1", "name": "Possible secret in web/index.html", "shortDescription": {"text": "Possible secret in web/index.html"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9e6a68edcdda118e", "name": "Very large file: website/penalty-kick-game/assets/three-DBMlPueJ.js (4049 lines)", "shortDescription": {"text": "Very large file: website/penalty-kick-game/assets/three-DBMlPueJ.js (4049 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-fb89265f2a6cdad4", "name": "Very large file: functions/__tests__/moderation-notifications.test.ts (1554 lines)", "shortDescription": {"text": "Very large file: functions/__tests__/moderation-notifications.test.ts (1554 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-897e6285a13529af", "name": "Very large file: functions/__tests__/favorite-team-notifications.test.ts (1457 lines)", "shortDescription": {"text": "Very large file: functions/__tests__/favorite-team-notifications.test.ts (1457 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 558 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 58 placeholder/mock markers across 14 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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, ci. 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-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b0683085e4550d7c", "name": "Commented-code block (7 lines) in scripts/country-scout/run.ts:285", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/country-scout/run.ts:285"}, "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-22dc2168faf0553d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/country-scout/merge-tournament-results.ts:293", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/country-scout/merge-tournament-results.ts:293"}, "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-2a44264c518f610b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 website/penalty-kick-game/assets/index-ZGNleOTQ.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 website/penalty-kick-game/assets/index-ZGNleOTQ.js:1"}, "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-d16a275cee5009b4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 website/penalty-kick-game/assets/three-DBMlPueJ.js:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 website/penalty-kick-game/assets/three-DBMlPueJ.js:5"}, "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-2752d1e980391212", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/screens/FanSubscriptionScreen.tsx:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/screens/FanSubscriptionScreen.tsx:66"}, "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-2ae48d62ae2f4276", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/sportsDataApiWrapper.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/sportsDataApiWrapper.ts:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cfcfeffd8f5aba81", "name": "Commented-code block (6 lines) in functions/src/relink-photos-from-storage.ts:203", "shortDescription": {"text": "Commented-code block (6 lines) in functions/src/relink-photos-from-storage.ts:203"}, "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-fe89b441ce785e8f", "name": "Commented-code block (6 lines) in functions/src/stripe-simple.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in functions/src/stripe-simple.ts:10"}, "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-0e70aeabcfe471ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 functions/src/generate-match-narratives.ts:513", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/src/generate-match-narratives.ts:513"}, "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-3d793a8ebe52fa0e", "name": "Commented-code block (6 lines) in functions/__tests__/setup.ts:84", "shortDescription": {"text": "Commented-code block (6 lines) in functions/__tests__/setup.ts:84"}, "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-4b16f03099cdec4e", "name": "Legacy-named symbol `isOld` in functions/__tests__/friend-request-notifications.test.ts:837", "shortDescription": {"text": "Legacy-named symbol `isOld` in functions/__tests__/friend-request-notifications.test.ts:837"}, "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-70fcae2d13c708b6", "name": "17 env vars used in code but missing from .env.example", "shortDescription": {"text": "17 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BASE_URL`, `CLAUDE_API_KEY`, `FIREBASE_CONFIG`, `GCLOUD_PROJECT`, `PLACES_API_KEY`, `SPORTSDATA_KEY`, `STRIPE_FAN_PASS_PRICE_ID`, `STRIPE_SECRET_KEY` + 9 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-6db49e097cda33d4", "name": "Frontend route `/leaderboard` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/leaderboard` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fa7aa24aa60c42d8", "name": "Frontend route `/profile` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/profile` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc81b0af50502b4a", "name": "Frontend route `/inventory` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/inventory` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c02e5a9adc035500", "name": "Frontend route `/venue/billing/success` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/venue/billing/success` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/25137"}, "properties": {"repository": "cryptochris8/Pregame-World-Cup", "repoUrl": "https://github.com/cryptochris8/Pregame-World-Cup", "branch": "main"}, "results": [{"ruleId": "scanner-c3b9ea725f7fcabc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/populate_firestore.js:42"}, "properties": {"repobilityId": "e289852ccd11f8e1", "scanner": "scanner-primary", "fingerprint": "c3b9ea725f7fcabc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cbe6dab6f7e998fd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/build-prompts.ts:47"}, "properties": {"repobilityId": "d0db67040d59fe02", "scanner": "scanner-primary", "fingerprint": "cbe6dab6f7e998fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-433d5dddb9f81f32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/scrub-narratives.ts:73"}, "properties": {"repobilityId": "50089fe795afe56a", "scanner": "scanner-primary", "fingerprint": "433d5dddb9f81f32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2bc24b62314123bd", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/country-scout/run.ts:285"}, "properties": {"repobilityId": "103ba271ef38a215", "scanner": "scanner-primary", "fingerprint": "2bc24b62314123bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bd8ed2d79105b397", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/run.ts:269"}, "properties": {"repobilityId": "e79c940a76e3bcc0", "scanner": "scanner-primary", "fingerprint": "bd8ed2d79105b397", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a2b92f96eb418641", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/merge-tournament-results.ts:321"}, "properties": {"repobilityId": "f8588b50f789c6a6", "scanner": "scanner-primary", "fingerprint": "a2b92f96eb418641", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-46eab1495b94833b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/country-scout/apply-scout-deltas.ts:39"}, "properties": {"repobilityId": "4ff9bb1e9fe1ee1a", "scanner": "scanner-primary", "fingerprint": "46eab1495b94833b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c8002b7c162d3c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 website/js/main.js:167"}, "properties": {"repobilityId": "8c4df2d74d29d8b3", "scanner": "scanner-primary", "fingerprint": "7c8002b7c162d3c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6beaa3c6447ebc78", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 website/penalty-kick-game/assets/three-DBMlPueJ.js:1"}, "properties": {"repobilityId": "75426a927b0c12a9", "scanner": "scanner-primary", "fingerprint": "6beaa3c6447ebc78", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4249ac4e6351c1dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/LoginScreen.tsx:18"}, "properties": {"repobilityId": "55f0caf72c4b6f60", "scanner": "scanner-primary", "fingerprint": "4249ac4e6351c1dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a80625fc64800f6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/FanSubscriptionScreen.tsx:36"}, "properties": {"repobilityId": "56fd3b8a8459fe34", "scanner": "scanner-primary", "fingerprint": "5a80625fc64800f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-350327a1e0f1fe52", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/SportsDataExample.tsx:32"}, "properties": {"repobilityId": "c9409af35c685c64", "scanner": "scanner-primary", "fingerprint": "350327a1e0f1fe52", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d271ddb51af23ee1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/screens/SportsDataExample.tsx:315"}, "properties": {"repobilityId": "c6c402eed12762d8", "scanner": "scanner-primary", "fingerprint": "d271ddb51af23ee1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-eed457c8052f9f9f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/venue/VenueProfile.tsx:84"}, "properties": {"repobilityId": "a80f9aaa1ded4957", "scanner": "scanner-primary", "fingerprint": "eed457c8052f9f9f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0aef234de52adf6d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/screens/venue/TestBilling.tsx:5"}, "properties": {"repobilityId": "c9763d6f9603c795", "scanner": "scanner-primary", "fingerprint": "0aef234de52adf6d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-843f8bb5934fbe95", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-manager-photos.ts:153"}, "properties": {"repobilityId": "c6dd6ec558a66dee", "scanner": "scanner-primary", "fingerprint": "843f8bb5934fbe95", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5e180ba4a21e62a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-utils.ts:124"}, "properties": {"repobilityId": "91176e2b40470d9b", "scanner": "scanner-primary", "fingerprint": "5e180ba4a21e62a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e50b6ec2317c329c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/test-access.ts:18"}, "properties": {"repobilityId": "cb2d6fb3eba8a957", "scanner": "scanner-primary", "fingerprint": "e50b6ec2317c329c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-66564aaa11ccfd6a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-manager-photos-v2.ts:79"}, "properties": {"repobilityId": "d0c0719b801233bb", "scanner": "scanner-primary", "fingerprint": "66564aaa11ccfd6a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c03e4c0743120cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-player-world-cup-stats.ts:20"}, "properties": {"repobilityId": "f2cfe4580d86d509", "scanner": "scanner-primary", "fingerprint": "7c03e4c0743120cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-76b0a4bfb7d00042", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-head-to-head.ts:19"}, "properties": {"repobilityId": "8bb74dd19258eac7", "scanner": "scanner-primary", "fingerprint": "76b0a4bfb7d00042", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6f9f43559ac5b92d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-all.ts:65"}, "properties": {"repobilityId": "4f6b9f2e88ab0092", "scanner": "scanner-primary", "fingerprint": "6f9f43559ac5b92d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5493be593ea60a8b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/relink-photos-from-storage.ts:62"}, "properties": {"repobilityId": "849efd7ea290a79a", "scanner": "scanner-primary", "fingerprint": "5493be593ea60a8b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-efdbfbb7805579bd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/list-storage.ts:15"}, "properties": {"repobilityId": "03a17f531944f292", "scanner": "scanner-primary", "fingerprint": "efdbfbb7805579bd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f4ddf47ab16e226f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/stripe-simple.ts:499"}, "properties": {"repobilityId": "871cf0764c61ca76", "scanner": "scanner-primary", "fingerprint": "f4ddf47ab16e226f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3d7fe6b87248f5d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-venue-enhancements.ts:21"}, "properties": {"repobilityId": "33af8d8656a515d2", "scanner": "scanner-primary", "fingerprint": "e3d7fe6b87248f5d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-01c183e928f38abe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/check-photos.ts:26"}, "properties": {"repobilityId": "ce281d594a7af32c", "scanner": "scanner-primary", "fingerprint": "01c183e928f38abe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b46be1c367a877d2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/upload-manager-photos.ts:64"}, "properties": {"repobilityId": "0fb20e033472cf5f", "scanner": "scanner-primary", "fingerprint": "b46be1c367a877d2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-752cd0cd2323e5b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/add-mock-summaries.ts:168"}, "properties": {"repobilityId": "39a0104e71789293", "scanner": "scanner-primary", "fingerprint": "752cd0cd2323e5b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-69cc358ce1d06f32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/relink-photos.ts:26"}, "properties": {"repobilityId": "8a94afda0fa93272", "scanner": "scanner-primary", "fingerprint": "69cc358ce1d06f32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1eff1db8cc76dc78", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-june2026-matches.ts:20"}, "properties": {"repobilityId": "0db16a3516b60540", "scanner": "scanner-primary", "fingerprint": "1eff1db8cc76dc78", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81be7a9cbe32f9e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/add-fra-eng-summary.ts:92"}, "properties": {"repobilityId": "a0b5f133eede0f73", "scanner": "scanner-primary", "fingerprint": "81be7a9cbe32f9e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6666e9c9abed321f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-world-cup-history.ts:20"}, "properties": {"repobilityId": "8f1eaf9fc881ae15", "scanner": "scanner-primary", "fingerprint": "6666e9c9abed321f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85a63652418ca38f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/check-collections.ts:35"}, "properties": {"repobilityId": "864d29928f62fe9e", "scanner": "scanner-primary", "fingerprint": "85a63652418ca38f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1d323ec7f8211ffd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/check-photos-v2.ts:87"}, "properties": {"repobilityId": "923eeb20d7614193", "scanner": "scanner-primary", "fingerprint": "1d323ec7f8211ffd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52272c0dd6e10b27", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-managers.ts:20"}, "properties": {"repobilityId": "308f688d8e07f274", "scanner": "scanner-primary", "fingerprint": "52272c0dd6e10b27", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a7decd0bcbfb73f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-team-players.ts:167"}, "properties": {"repobilityId": "ed6a991270e6cb16", "scanner": "scanner-primary", "fingerprint": "9a7decd0bcbfb73f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f94901cf0ba3db3d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-match-summaries.ts:29"}, "properties": {"repobilityId": "ec46df8edd0e78e4", "scanner": "scanner-primary", "fingerprint": "f94901cf0ba3db3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8bacdd32d733fbf4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/moderation-notifications.ts:49"}, "properties": {"repobilityId": "c5ed78f2a88b5cc1", "scanner": "scanner-primary", "fingerprint": "8bacdd32d733fbf4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6e40f9057c11a8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/upload-missing-manager-photos.ts:55"}, "properties": {"repobilityId": "fcc448cbfad1a3e0", "scanner": "scanner-primary", "fingerprint": "c6e40f9057c11a8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6e4155ebf4c3510b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/check-match-times.ts:16"}, "properties": {"repobilityId": "1407d1d78f192350", "scanner": "scanner-primary", "fingerprint": "6e4155ebf4c3510b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5803865f3deae2ac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-knockout-matches.ts:20"}, "properties": {"repobilityId": "7f073eaf79e2194a", "scanner": "scanner-primary", "fingerprint": "5803865f3deae2ac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bbacd8f59b16e0d4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fix-match-times.ts:244"}, "properties": {"repobilityId": "59e3905741f2a03a", "scanner": "scanner-primary", "fingerprint": "bbacd8f59b16e0d4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0c4d278b7dcc7463", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/seed-match-narratives.ts:34"}, "properties": {"repobilityId": "d2aa3b99e30ff67e", "scanner": "scanner-primary", "fingerprint": "0c4d278b7dcc7463", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6dcb2fe02831f0a5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-player-photos.ts:148"}, "properties": {"repobilityId": "e5c3c13f31a6d92e", "scanner": "scanner-primary", "fingerprint": "6dcb2fe02831f0a5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e43f00e56c0d9692", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/upload-missing-photos.ts:130"}, "properties": {"repobilityId": "0bb0fb91c9dca90f", "scanner": "scanner-primary", "fingerprint": "e43f00e56c0d9692", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4cd3a007746901f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/live-score-sync.ts:614"}, "properties": {"repobilityId": "e2c9781c9376279d", "scanner": "scanner-primary", "fingerprint": "a4cd3a007746901f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f813344ca159c3d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 functions/src/generate-match-narratives.ts:625"}, "properties": {"repobilityId": "6f4f60b190a8a621", "scanner": "scanner-primary", "fingerprint": "0f813344ca159c3d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7404c817769beec5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/generate-match-narratives.ts:545"}, "properties": {"repobilityId": "38ec652e426fcd6d", "scanner": "scanner-primary", "fingerprint": "7404c817769beec5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b8a64a662d7fedf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/photo-fetcher-utils.ts:568"}, "properties": {"repobilityId": "e47aff9f9cb026db", "scanner": "scanner-primary", "fingerprint": "9b8a64a662d7fedf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-26e72ad796a7fc31", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/fetch-player-photos-v2.ts:80"}, "properties": {"repobilityId": "c4d0b809d5cbb0aa", "scanner": "scanner-primary", "fingerprint": "26e72ad796a7fc31", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6ae6f88dd244fde0", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/country-scout/run.ts:25"}, "properties": {"repobilityId": "44d1e5a7dd697307", "scanner": "scanner-primary", "fingerprint": "6ae6f88dd244fde0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/country-scout/run.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-ff8edd575086b877", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in website/js/main.js:72"}, "properties": {"repobilityId": "44fffd25e63e5a4c", "scanner": "scanner-primary", "fingerprint": "ff8edd575086b877", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "website/js/main.js"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-fd17c623ad17627a", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in functions/src/seed-all.ts:27"}, "properties": {"repobilityId": "76ea479f04b47650", "scanner": "scanner-primary", "fingerprint": "fd17c623ad17627a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "functions/src/seed-all.ts"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-33f62be514886bbb", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in functions/__tests__/http-functions.test.ts:136"}, "properties": {"repobilityId": "bf04a3de9c8cacb8", "scanner": "scanner-primary", "fingerprint": "33f62be514886bbb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "functions/__tests__/http-functions.test.ts"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-e9b76aa2df7c78e1", "level": "error", "message": {"text": "Possible secret in web/index.html"}, "properties": {"repobilityId": "612605837bd1ceb2", "scanner": "scanner-primary", "fingerprint": "e9b76aa2df7c78e1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web/index.html"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-9e6a68edcdda118e", "level": "note", "message": {"text": "Very large file: website/penalty-kick-game/assets/three-DBMlPueJ.js (4049 lines)"}, "properties": {"repobilityId": "60bcde9a6282c17a", "scanner": "scanner-primary", "fingerprint": "9e6a68edcdda118e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fb89265f2a6cdad4", "level": "note", "message": {"text": "Very large file: functions/__tests__/moderation-notifications.test.ts (1554 lines)"}, "properties": {"repobilityId": "cbb809e50d4159ca", "scanner": "scanner-primary", "fingerprint": "fb89265f2a6cdad4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-897e6285a13529af", "level": "note", "message": {"text": "Very large file: functions/__tests__/favorite-team-notifications.test.ts (1457 lines)"}, "properties": {"repobilityId": "8777fb99ac89904d", "scanner": "scanner-primary", "fingerprint": "897e6285a13529af", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "83e5fc20d932195b", "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": "f15b3e01380f17d8", "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": "1beedf66fa6a5513", "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": "0737cb9410cfaff0", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "e1030f4c3e62639d", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "96ef7df4eaace2f6", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b0683085e4550d7c", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/country-scout/run.ts:285"}, "properties": {"repobilityId": "807c4ffb2314b697", "scanner": "scanner-primary", "fingerprint": "b0683085e4550d7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22dc2168faf0553d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/country-scout/merge-tournament-results.ts:293"}, "properties": {"repobilityId": "bbfc6c2c6a75bb0a", "scanner": "scanner-primary", "fingerprint": "22dc2168faf0553d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a44264c518f610b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 website/penalty-kick-game/assets/index-ZGNleOTQ.js:1"}, "properties": {"repobilityId": "bd6000ebae94cad8", "scanner": "scanner-primary", "fingerprint": "2a44264c518f610b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d16a275cee5009b4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 website/penalty-kick-game/assets/three-DBMlPueJ.js:5"}, "properties": {"repobilityId": "67f169946e31ff42", "scanner": "scanner-primary", "fingerprint": "d16a275cee5009b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2752d1e980391212", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/screens/FanSubscriptionScreen.tsx:66"}, "properties": {"repobilityId": "153e184193ccf36f", "scanner": "scanner-primary", "fingerprint": "2752d1e980391212", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ae48d62ae2f4276", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/sportsDataApiWrapper.ts:59"}, "properties": {"repobilityId": "ce807a30c9b8b368", "scanner": "scanner-primary", "fingerprint": "2ae48d62ae2f4276", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cfcfeffd8f5aba81", "level": "none", "message": {"text": "Commented-code block (6 lines) in functions/src/relink-photos-from-storage.ts:203"}, "properties": {"repobilityId": "4b3f542d3924f14f", "scanner": "scanner-primary", "fingerprint": "cfcfeffd8f5aba81", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe89b441ce785e8f", "level": "none", "message": {"text": "Commented-code block (6 lines) in functions/src/stripe-simple.ts:10"}, "properties": {"repobilityId": "766f7de8651b3153", "scanner": "scanner-primary", "fingerprint": "fe89b441ce785e8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e70aeabcfe471ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/src/generate-match-narratives.ts:513"}, "properties": {"repobilityId": "7f0f903628306de2", "scanner": "scanner-primary", "fingerprint": "0e70aeabcfe471ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d793a8ebe52fa0e", "level": "none", "message": {"text": "Commented-code block (6 lines) in functions/__tests__/setup.ts:84"}, "properties": {"repobilityId": "7499f35d59265f80", "scanner": "scanner-primary", "fingerprint": "3d793a8ebe52fa0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b16f03099cdec4e", "level": "note", "message": {"text": "Legacy-named symbol `isOld` in functions/__tests__/friend-request-notifications.test.ts:837"}, "properties": {"repobilityId": "2f9f2cf499cfc5c3", "scanner": "scanner-primary", "fingerprint": "4b16f03099cdec4e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-70fcae2d13c708b6", "level": "note", "message": {"text": "17 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "f21675bed249619c", "scanner": "scanner-primary", "fingerprint": "70fcae2d13c708b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-6db49e097cda33d4", "level": "warning", "message": {"text": "Frontend route `/leaderboard` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4dd66b842af34ce1", "scanner": "scanner-primary", "fingerprint": "6db49e097cda33d4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fa7aa24aa60c42d8", "level": "warning", "message": {"text": "Frontend route `/profile` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5aabde84ab4f6afe", "scanner": "scanner-primary", "fingerprint": "fa7aa24aa60c42d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dc81b0af50502b4a", "level": "warning", "message": {"text": "Frontend route `/inventory` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5d61d10a0cb2a3b9", "scanner": "scanner-primary", "fingerprint": "dc81b0af50502b4a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c02e5a9adc035500", "level": "warning", "message": {"text": "Frontend route `/venue/billing/success` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c8679bf75e6c8ae7", "scanner": "scanner-primary", "fingerprint": "c02e5a9adc035500", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}