{"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-2b061522511c856f", "name": "Stray `console.log` in TS/JS \u2014 publish-article.js:346", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 publish-article.js:346"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62710ac872692bab", "name": "Stray `console.log` in TS/JS \u2014 server.js:148", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server.js: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-a859706424be2b9c", "name": "Stray `console.log` in TS/JS \u2014 functions/api/newsletter/preview.js:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/api/newsletter/preview.js:77"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78ad2ab59680b1b3", "name": "Stray `console.log` in TS/JS \u2014 scheduler-worker/worker.js:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler-worker/worker.js:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-03db3182ca794097", "name": "Stray `console.log` in TS/JS \u2014 newsletter-cron-worker/worker.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 newsletter-cron-worker/worker.js: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-0efc85fca1a8a59d", "name": "Stray `console.log` in TS/JS \u2014 js/main.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 js/main.js:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac9e0ab8e83c1cdd", "name": "Stray `console.log` in TS/JS \u2014 js/layout.js:301", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 js/layout.js:301"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8829c3d4fe899cf6", "name": "Icon-only button without accessible name \u2014 js/dashboard/marketing.js:2316", "shortDescription": {"text": "Icon-only button without accessible name \u2014 js/dashboard/marketing.js:2316"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-63491e9085ac39e5", "name": "Stray `console.log` in TS/JS \u2014 js/dashboard/marketing.js:618", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 js/dashboard/marketing.js:618"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-03630b44c75589e5", "name": "Stray `console.log` in TS/JS \u2014 js/dashboard/newsletter.js:262", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 js/dashboard/newsletter.js:262"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a67d574e711594d", "name": "Stray `console.log` in TS/JS \u2014 js/widgets/workflow-preview.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 js/widgets/workflow-preview.js: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-b3801f04f4638f15", "name": "Stray `console.log` in TS/JS \u2014 scripts/extract-hero-frames.js:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-hero-frames.js: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-c515cd884c0b45ad", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-phones.js:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-phones.js:91"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a08494798b58d10e", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-lqip-manifest.js:128", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-lqip-manifest.js:128"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17d221976face07c", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-cloudflare.js:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-cloudflare.js:119"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0cda1a0d6049da5c", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-tags.js:156", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-tags.js:156"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48defe0fd1145a01", "name": "Stray `console.log` in TS/JS \u2014 scripts/import-json-to-firestore.js:158", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-json-to-firestore.js:158"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-968c3684abaed3a3", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-content-tracker.js:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-content-tracker.js: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-4b6f2a97a63fbefb", "name": "Stray `console.log` in TS/JS \u2014 founders-sms-worker/worker.js:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 founders-sms-worker/worker.js: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-457cf8d5c5ba2658", "name": "Stray `console.log` in TS/JS \u2014 scheduler/projectState.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/projectState.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-889c587738fc151d", "name": "Stray `console.log` in TS/JS \u2014 scheduler/startupVerification.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/startupVerification.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-feaab7823643514f", "name": "Stray `console.log` in TS/JS \u2014 scheduler/proposalEditFix.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/proposalEditFix.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-99e5f3457241bb42", "name": "Stray `console.log` in TS/JS \u2014 scheduler/modalFixes_APPLY.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/modalFixes_APPLY.js:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32f73d6033de9af4", "name": "Stray `console.log` in TS/JS \u2014 scheduler/dashboard.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/dashboard.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ca93ba8e5fa9061", "name": "Stray `console.log` in TS/JS \u2014 scheduler/auth.js:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/auth.js: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-abe54cc27667aeff", "name": "Stray `console.log` in TS/JS \u2014 scheduler/stateManager.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/stateManager.js: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-f55fade31320b541", "name": "Stray `console.log` in TS/JS \u2014 scheduler/dashboardHelpers.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/dashboardHelpers.js: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-20b4508e44a8ea0e", "name": "Stray `console.log` in TS/JS \u2014 scheduler/titleEditFix.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/titleEditFix.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-31b06d7d0950127e", "name": "Stray `console.log` in TS/JS \u2014 scheduler/directFormFix.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/directFormFix.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-9c7683f80ab8fbae", "name": "Stray `console.log` in TS/JS \u2014 scheduler/deadlineFixes_APPLY.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/deadlineFixes_APPLY.js:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-449171213015acee", "name": "Stray `console.log` in TS/JS \u2014 scheduler/proposalEditButtons.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/proposalEditButtons.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-3bddb2c95a32f403", "name": "Stray `console.log` in TS/JS \u2014 scheduler/fixedSubscriptions.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/fixedSubscriptions.js:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a68994107a95b83", "name": "Stray `console.log` in TS/JS \u2014 scheduler/social.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/social.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-56818247c562e6c0", "name": "Insecure pattern 'direct_innerhtml_assignment' in contact.html:418", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in contact.html:418"}, "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-d7366b839e9cf7fb", "name": "Insecure pattern 'direct_innerhtml_assignment' in brain-teaser.html:697", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in brain-teaser.html:697"}, "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-ab6292c32cb8ede6", "name": "Insecure pattern 'direct_innerhtml_assignment' in collaborate.html:1761", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in collaborate.html:1761"}, "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-ce638793090216fa", "name": "Insecure pattern 'direct_innerhtml_assignment' in raffle.html:1271", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in raffle.html:1271"}, "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-9ab4f9f8522ac1eb", "name": "Insecure pattern 'cors_wildcard' in server.js:13", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in server.js:13"}, "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-0f034bace9a7f3cd", "name": "Possible secret in q7x9m2k5p8wl4n6r1t3vb.html", "shortDescription": {"text": "Possible secret in q7x9m2k5p8wl4n6r1t3vb.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-8614e6ebd17845e2", "name": "Insecure pattern 'direct_innerhtml_assignment' in q7x9m2k5p8wl4n6r1t3vb.html:594", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in q7x9m2k5p8wl4n6r1t3vb.html:594"}, "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-db426c7356099a9e", "name": "Insecure pattern 'direct_innerhtml_assignment' in unsubscribe.html:285", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in unsubscribe.html:285"}, "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-d08c3fb2bf63ba8e", "name": "Insecure pattern 'cors_wildcard' in functions/api/image-proxy.js:87", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in functions/api/image-proxy.js:87"}, "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-732692f49761ee81", "name": "Insecure pattern 'private_key_in_repo' in functions/_utils/firebase.js:151", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in functions/_utils/firebase.js:151"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6f8b0869b4387958", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article11.html:1532", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article11.html:1532"}, "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-f3aa629b6537f448", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article23.html:1496", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article23.html:1496"}, "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-b33b3f94c36aeda1", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article17.html:1497", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article17.html:1497"}, "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-161d302f1babca6a", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article7.html:678", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article7.html:678"}, "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-6e4319806d0887ee", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article29.html:1532", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article29.html:1532"}, "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-79c91d477063f2ac", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article16.html:1497", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article16.html:1497"}, "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-fd9f9a55b0926d2d", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article3.html:679", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article3.html:679"}, "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-d9fb45e694e97b2f", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article5.html:677", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article5.html:677"}, "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-ade657ee7e10d442", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article8.html:652", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article8.html:652"}, "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-5373dd15a49bf5b5", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article22.html:1497", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article22.html:1497"}, "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-1eedad51e6a03b70", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article2.html:679", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article2.html:679"}, "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-6a92cc001ee04447", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article33.html:1532", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article33.html:1532"}, "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-05ab49a9535a6cec", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article27.html:1532", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article27.html:1532"}, "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-6f063a921312f1f3", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article25.html:1496", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article25.html:1496"}, "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-d6a000cb4e592256", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article20.html:1497", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article20.html:1497"}, "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-4eea8e412655aac5", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article26.html:1532", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article26.html:1532"}, "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-6b4df4365c39cb02", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article31.html:1574", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article31.html:1574"}, "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-c4cad255232b94a7", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article15.html:1497", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article15.html:1497"}, "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-01e8f3c9477c7591", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article4.html:677", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article4.html:677"}, "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-28d5f0ae49bac6ff", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article13.html:1532", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article13.html:1532"}, "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-f262631be89d4094", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article30.html:1616", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article30.html:1616"}, "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-6b4618cd13d689e4", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article12.html:1532", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article12.html:1532"}, "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-4cb3ef99be6a03e9", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article18.html:1496", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article18.html:1496"}, "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-1aa6df01e7573e64", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article19.html:1496", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article19.html:1496"}, "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-8b2062efe17354ed", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article14.html:1497", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article14.html:1497"}, "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-8ce6ca2c3172213d", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article21.html:1485", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article21.html:1485"}, "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-89840e7f4ada421d", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article10.html:1532", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article10.html:1532"}, "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-7700bbcb865827c7", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article9.html:677", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article9.html:677"}, "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-7b1d2f17a58935c3", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article6.html:677", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article6.html:677"}, "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-107b5eb6fafd26a9", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article24.html:1497", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article24.html:1497"}, "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-9f46c77079ec1191", "name": "Insecure pattern 'document_write' in posts/games/article32.html:174", "shortDescription": {"text": "Insecure pattern 'document_write' in posts/games/article32.html:174"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-01f13ff0baaec62f", "name": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article32.html:2004", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article32.html:2004"}, "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-8075f7eaec821136", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/glossary.js:121", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/glossary.js:121"}, "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-cd6789535d67fe7d", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/newsletter-handler.js:69", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/newsletter-handler.js:69"}, "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-a52f7bd767fee1ca", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/studio-editor.js:236", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/studio-editor.js:236"}, "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-53fc65554f63400d", "name": "Possible secret in js/firebase-config.js", "shortDescription": {"text": "Possible secret in js/firebase-config.js"}, "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-f04d9c8257a5cc71", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/articles-new.js:359", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/articles-new.js:359"}, "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-144060d58947da4d", "name": "Insecure pattern 'insert_adjacent_html' in js/articles-new.js:484", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in js/articles-new.js:484"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e6eb8f55a8baca6", "name": "Possible secret in js/firebase-dual-config.js", "shortDescription": {"text": "Possible secret in js/firebase-dual-config.js"}, "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-faebedda96c631c9", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/main.js:489", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/main.js:489"}, "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-3b262d7d183cea73", "name": "Insecure pattern 'domparser_html_parse' in js/main.js:2509", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in js/main.js:2509"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-70ac916cf474d4b5", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/layout.js:77", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/layout.js:77"}, "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-fb3269dab55249a6", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/book-reviews.js:441", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/book-reviews.js:441"}, "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-af79f69da7ac7092", "name": "Insecure pattern 'insert_adjacent_html' in js/book-reviews.js:1469", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in js/book-reviews.js:1469"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-108ff1f6cd416434", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/overview.js:19", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/overview.js:19"}, "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-3756a2ba4b6f5ab9", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/guidelines.js:414", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/guidelines.js:414"}, "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-de57f22aa475d627", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/games.js:29", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/games.js:29"}, "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-d18677c815edacb2", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/activity.js:44", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/activity.js:44"}, "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-d67cdf1c3374b915", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/searchability.js:89", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/searchability.js:89"}, "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-fefd111586ca4bdd", "name": "Insecure pattern 'direct_outerhtml_assignment' in js/dashboard/searchability.js:2074", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in js/dashboard/searchability.js:2074"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7ee1433ad281e71f", "name": "Insecure pattern 'insert_adjacent_html' in js/dashboard/searchability.js:2076", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in js/dashboard/searchability.js:2076"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48d9c9623db70b25", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/submissions.js:39", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/submissions.js:39"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1f823144c166018", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/admin.js:19", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/admin.js:19"}, "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-f1c30d5923240f78", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/marketing.js:8", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/marketing.js:8"}, "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-e964bc69638cdffb", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/writer.js:46", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/writer.js:46"}, "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-ad8e525464757cfc", "name": "Insecure pattern 'direct_outerhtml_assignment' in js/dashboard/writer.js:2176", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in js/dashboard/writer.js:2176"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17dc707ec828ca4d", "name": "Insecure pattern 'domparser_html_parse' in js/dashboard/writer.js:1257", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in js/dashboard/writer.js:1257"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c9fdbdd34a1b5b80", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/pipeline.js:134", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/pipeline.js:134"}, "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-a575a34b9ef837d0", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/ui.js:10", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/ui.js:10"}, "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-41384eca1508ac31", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/tasks-admin.js:40", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/tasks-admin.js:40"}, "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-53f0bb79bc0e93fa", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/book-reviews-admin.js:26", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/book-reviews-admin.js:26"}, "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-4a40fca614c5e94b", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/task-engine.js:561", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/task-engine.js:561"}, "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-a5c66b6ac84befcf", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/final-review.js:36", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/final-review.js:36"}, "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-2d994a9cce876b38", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/directory.js:43", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/directory.js:43"}, "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-5bf8b223bfa47dec", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/notifications.js:133", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/notifications.js:133"}, "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-4ee51623d15131d9", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/admin-import.js:95", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/admin-import.js:95"}, "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-084b5faf4f75cad1", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/calendar-export.js:337", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/calendar-export.js:337"}, "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-88f7fb0eda6d6fc5", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/planner.js:218", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/planner.js:218"}, "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-7ec1f84138bc6097", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/schedule-calendar.js:484", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/schedule-calendar.js:484"}, "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-33f000ebb9e0ed95", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/app.js:508", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/app.js:508"}, "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-f7a7a7fea21bc6eb", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/book-reviews-writer.js:36", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/book-reviews-writer.js:36"}, "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-efb6459417b7233a", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/tasks.js:128", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/tasks.js:128"}, "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-bedd5c6632d1739a", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/newsletter.js:9", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/newsletter.js:9"}, "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-9210477e83373a19", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/editor.js:29", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/editor.js:29"}, "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-729cacc2c871e6f0", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/widgets/workflow-preview.js:115", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/widgets/workflow-preview.js:115"}, "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-e6857aa4aceb7be2", "name": "Insecure pattern 'node_child_process' in scripts/extract-hero-frames.js:26", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/extract-hero-frames.js:26"}, "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-8d9f2c39686d672c", "name": "Insecure pattern 'direct_innerhtml_assignment' in admin/users.html:431", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin/users.html:431"}, "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-46fec315fa5017e4", "name": "Insecure pattern 'node_child_process' in tools/bundle-shim/bundle.js:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in tools/bundle-shim/bundle.js:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-159be4d33e064731", "name": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/dashboard.html:834", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/dashboard.html:834"}, "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-2844d2451cf7786f", "name": "Possible secret in scheduler/dashboard.js", "shortDescription": {"text": "Possible secret in scheduler/dashboard.js"}, "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-5d24c3f288129287", "name": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/dashboard.js:529", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/dashboard.js:529"}, "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-9042c65425bb74c5", "name": "Possible secret in scheduler/auth.js", "shortDescription": {"text": "Possible secret in scheduler/auth.js"}, "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-9554d48b5cde51cb", "name": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/debugConsole.js:10", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/debugConsole.js:10"}, "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-8a19aca1bd078f61", "name": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/dashboardHelpers.js:492", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/dashboardHelpers.js:492"}, "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-9f69ce995f9ecb8b", "name": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/deadlineFixes_APPLY.js:201", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/deadlineFixes_APPLY.js:201"}, "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-d7bf2ac2fe03e6f8", "name": "Possible secret in scheduler/social.js", "shortDescription": {"text": "Possible secret in scheduler/social.js"}, "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-4bd974a0fa703c69", "name": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/social.js:417", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/social.js:417"}, "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-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-b38b62b24378e86a", "name": "Very large file: functions/api/bot/run.js (1369 lines)", "shortDescription": {"text": "Very large file: functions/api/bot/run.js (1369 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-58c96f4bb385c756", "name": "Very large file: functions/_utils/reminder-emails.js (1804 lines)", "shortDescription": {"text": "Very large file: functions/_utils/reminder-emails.js (1804 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-9a982ad03534fd8f", "name": "Very large file: js/main.js (4444 lines)", "shortDescription": {"text": "Very large file: js/main.js (4444 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-233507c4e7b60400", "name": "Very large file: js/book-reviews.js (2177 lines)", "shortDescription": {"text": "Very large file: js/book-reviews.js (2177 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-979c7eb55bd8d0fc", "name": "Very large file: js/dashboard/searchability.js (3003 lines)", "shortDescription": {"text": "Very large file: js/dashboard/searchability.js (3003 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-54a4f8cb8c65dc78", "name": "Very large file: js/dashboard/admin.js (1792 lines)", "shortDescription": {"text": "Very large file: js/dashboard/admin.js (1792 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-73ffe55b690ded82", "name": "Very large file: js/dashboard/marketing.js (3945 lines)", "shortDescription": {"text": "Very large file: js/dashboard/marketing.js (3945 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-11684e2cc583b809", "name": "Very large file: js/dashboard/writer.js (3551 lines)", "shortDescription": {"text": "Very large file: js/dashboard/writer.js (3551 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-ebd52d5c99d9a138", "name": "Very large file: js/dashboard/pipeline.js (1549 lines)", "shortDescription": {"text": "Very large file: js/dashboard/pipeline.js (1549 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-77670c495c95a461", "name": "Very large file: js/dashboard/admin-import.js (1817 lines)", "shortDescription": {"text": "Very large file: js/dashboard/admin-import.js (1817 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-ecb184b0e95499e4", "name": "Very large file: js/dashboard/planner.js (1568 lines)", "shortDescription": {"text": "Very large file: js/dashboard/planner.js (1568 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-e5cbe376d2d90f0c", "name": "Very large file: js/dashboard/schedule-calendar.js (1151 lines)", "shortDescription": {"text": "Very large file: js/dashboard/schedule-calendar.js (1151 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-77028133deeb7024", "name": "Very large file: js/dashboard/app.js (1346 lines)", "shortDescription": {"text": "Very large file: js/dashboard/app.js (1346 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-e164d1b28ebde061", "name": "Very large file: scheduler/dashboard.js (7435 lines)", "shortDescription": {"text": "Very large file: scheduler/dashboard.js (7435 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 136 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 390 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 134 placeholder/mock markers across 25 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, tests. 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": "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, ci, tests. 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-e33718ffa1857ba2", "name": "Commented-code block (11 lines) in publish-article.js:414", "shortDescription": {"text": "Commented-code block (11 lines) in publish-article.js:414"}, "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-b190c772f479de0c", "name": "Commented-code block (6 lines) in functions/api/image-proxy.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in functions/api/image-proxy.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c83a34dacd026232", "name": "Commented-code block (6 lines) in functions/api/publish.js:5", "shortDescription": {"text": "Commented-code block (6 lines) in functions/api/publish.js: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-6b1174ed40338aa7", "name": "Commented-code block (5 lines) in functions/api/welcome-email.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in functions/api/welcome-email.js: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-055eff6236c1af12", "name": "Commented-code block (7 lines) in functions/api/bot/founders-sms.js:35", "shortDescription": {"text": "Commented-code block (7 lines) in functions/api/bot/founders-sms.js:35"}, "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-ef9adf9f67a457cb", "name": "Commented-code block (10 lines) in functions/api/bot/run.js:11", "shortDescription": {"text": "Commented-code block (10 lines) in functions/api/bot/run.js:11"}, "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-b1c47dd22b0c8591", "name": "Commented-code block (5 lines) in functions/api/notify/event.js:112", "shortDescription": {"text": "Commented-code block (5 lines) in functions/api/notify/event.js:112"}, "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-cfd35423ef4aed24", "name": "Commented-code block (7 lines) in functions/api/notify/published.js:8", "shortDescription": {"text": "Commented-code block (7 lines) in functions/api/notify/published.js:8"}, "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-5147f6fe2f79accd", "name": "Commented-code block (5 lines) in functions/api/notify/dm.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in functions/api/notify/dm.js:3"}, "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-793672d59fbd92d5", "name": "Commented-code block (14 lines) in functions/api/analytics/visit.js:6", "shortDescription": {"text": "Commented-code block (14 lines) in functions/api/analytics/visit.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1438f457ea4222ca", "name": "Commented-code block (6 lines) in functions/api/tasks/notify.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in functions/api/tasks/notify.js:3"}, "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-13601e829c74e79e", "name": "Commented-code block (5 lines) in functions/api/admin/submissions.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in functions/api/admin/submissions.js:3"}, "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-42571ef4233a4f24", "name": "Commented-code block (5 lines) in functions/api/searchability/query.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in functions/api/searchability/query.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5fdaa3ae94f7fe91", "name": "`fetch()` without try/.catch or AbortSignal \u2014 functions/api/searchability/query.js:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/api/searchability/query.js:74"}, "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-d653a425edbcb01f", "name": "Commented-code block (17 lines) in functions/api/book-reviews/submit.js:14", "shortDescription": {"text": "Commented-code block (17 lines) in functions/api/book-reviews/submit.js:14"}, "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-195ddec13533ee43", "name": "Commented-code block (13 lines) in functions/api/book-reviews/decide.js:6", "shortDescription": {"text": "Commented-code block (13 lines) in functions/api/book-reviews/decide.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5008ffac3ec38ffb", "name": "Commented-code block (5 lines) in functions/api/newsletter/preview.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in functions/api/newsletter/preview.js: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-40f519136c0a356e", "name": "Commented-code block (5 lines) in functions/api/newsletter/dispatch-due.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in functions/api/newsletter/dispatch-due.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-863d2fb51566cd31", "name": "Commented-code block (8 lines) in functions/api/newsletter/send.js:6", "shortDescription": {"text": "Commented-code block (8 lines) in functions/api/newsletter/send.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba672b5fd0500d6d", "name": "Commented-code block (6 lines) in functions/api/calendar/notify.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in functions/api/calendar/notify.js:3"}, "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-089608820f461fca", "name": "Commented-code block (9 lines) in functions/book-review/[slug].js:5", "shortDescription": {"text": "Commented-code block (9 lines) in functions/book-review/[slug].js: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-31bf9b266dfcb900", "name": "`fetch()` without try/.catch or AbortSignal \u2014 functions/book-review/[slug].js:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/book-review/[slug].js:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b43a6e00ba08064", "name": "Commented-code block (5 lines) in functions/_utils/firebase.js:52", "shortDescription": {"text": "Commented-code block (5 lines) in functions/_utils/firebase.js:52"}, "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-1eb873bdc9b1ab92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 functions/_utils/firebase.js:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/_utils/firebase.js:19"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-99fcfa96714b840e", "name": "Commented-code block (5 lines) in functions/_utils/reminder-emails.js:1104", "shortDescription": {"text": "Commented-code block (5 lines) in functions/_utils/reminder-emails.js:1104"}, "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-b4b335520b1d2ba0", "name": "Commented-code block (5 lines) in functions/_utils/bot-logic.js:6", "shortDescription": {"text": "Commented-code block (5 lines) in functions/_utils/bot-logic.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6dc26c96d442618b", "name": "Commented-code block (5 lines) in functions/_utils/resend.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in functions/_utils/resend.js: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-9f35ca3639beee73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 functions/_utils/resend.js:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/_utils/resend.js:55"}, "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-ca6e3451312e276a", "name": "Commented-code block (10 lines) in functions/_utils/notifications.js:9", "shortDescription": {"text": "Commented-code block (10 lines) in functions/_utils/notifications.js:9"}, "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-1f6a069b3f6276ea", "name": "Commented-code block (6 lines) in functions/_utils/article-meta.js:396", "shortDescription": {"text": "Commented-code block (6 lines) in functions/_utils/article-meta.js:396"}, "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-06b56f3de359e468", "name": "`fetch()` without try/.catch or AbortSignal \u2014 functions/_utils/article-meta.js:309", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/_utils/article-meta.js:309"}, "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-0ac517b87a44d911", "name": "Commented-code block (7 lines) in functions/_utils/seo-notify.js:3", "shortDescription": {"text": "Commented-code block (7 lines) in functions/_utils/seo-notify.js:3"}, "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-f1a4dfe1d7687645", "name": "Commented-code block (5 lines) in functions/_utils/newsletter-template.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in functions/_utils/newsletter-template.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e491244840ef6c1", "name": "Commented-code block (5 lines) in functions/_utils/task-emails.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in functions/_utils/task-emails.js:3"}, "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-94288655510ae2ed", "name": "Commented-code block (6 lines) in functions/article/[slug].js:3", "shortDescription": {"text": "Commented-code block (6 lines) in functions/article/[slug].js:3"}, "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-210e78785901e3fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 functions/article/[slug].js:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/article/[slug].js: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-80ce339ec0cd2e33", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scheduler-worker/worker.js:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scheduler-worker/worker.js: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-8b04688b24f4aab6", "name": "Commented-code block (5 lines) in newsletter-cron-worker/worker.js:7", "shortDescription": {"text": "Commented-code block (5 lines) in newsletter-cron-worker/worker.js:7"}, "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-07aff1eacab1a7a8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 newsletter-cron-worker/worker.js:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 newsletter-cron-worker/worker.js:40"}, "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-07c13be721253325", "name": "Commented-code block (5 lines) in js/admin-publish-bridge.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in js/admin-publish-bridge.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd4abbda5ae559a0", "name": "Commented-code block (9 lines) in js/studio-editor.js:1", "shortDescription": {"text": "Commented-code block (9 lines) in js/studio-editor.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff8ea83e00561470", "name": "Commented-code block (5 lines) in js/image-utils.js:13", "shortDescription": {"text": "Commented-code block (5 lines) in js/image-utils.js:13"}, "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-d99a34cbae2fac2a", "name": "Commented-code block (6 lines) in js/articles-new.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in js/articles-new.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba4be6fbb363c91c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 js/articles-new.js:240", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/articles-new.js:240"}, "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-7ab59559225738f8", "name": "Commented-code block (7 lines) in js/data.js:5", "shortDescription": {"text": "Commented-code block (7 lines) in js/data.js: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-79b114aade03c4e7", "name": "Legacy-named symbol `newsletter__copy` in js/main.js:1805", "shortDescription": {"text": "Legacy-named symbol `newsletter__copy` in js/main.js:1805"}, "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-774900abd357aa37", "name": "Commented-code block (5 lines) in js/main.js:49", "shortDescription": {"text": "Commented-code block (5 lines) in js/main.js:49"}, "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-429f98d5bfd1e3a2", "name": "Commented-code block (9 lines) in js/layout.js:31", "shortDescription": {"text": "Commented-code block (9 lines) in js/layout.js: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-547b7c9019f0413b", "name": "Commented-code block (8 lines) in js/book-reviews.js:1", "shortDescription": {"text": "Commented-code block (8 lines) in js/book-reviews.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-260a0ac268e3836c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 js/book-reviews.js:339", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/book-reviews.js:339"}, "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-e4b020c442e67706", "name": "Commented-code block (5 lines) in js/dashboard/overview.js:117", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/overview.js:117"}, "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-3fe2a9d39ab2ba81", "name": "Commented-code block (9 lines) in js/dashboard/games.js:11", "shortDescription": {"text": "Commented-code block (9 lines) in js/dashboard/games.js:11"}, "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-3b5ed424a2ce2635", "name": "Commented-code block (9 lines) in js/dashboard/activity.js:3", "shortDescription": {"text": "Commented-code block (9 lines) in js/dashboard/activity.js:3"}, "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-b723310420390179", "name": "Commented-code block (12 lines) in js/dashboard/searchability.js:4", "shortDescription": {"text": "Commented-code block (12 lines) in js/dashboard/searchability.js:4"}, "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-90360f0e1671dfc0", "name": "Commented-code block (5 lines) in js/dashboard/submissions.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/submissions.js:3"}, "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-f9c2fe52dda5db5f", "name": "Commented-code block (5 lines) in js/dashboard/admin.js:947", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/admin.js:947"}, "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-edc4f97799666c9b", "name": "Commented-code block (5 lines) in js/dashboard/marketing.js:725", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/marketing.js:725"}, "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-119293fa57f80026", "name": "Commented-code block (7 lines) in js/dashboard/writer.js:23", "shortDescription": {"text": "Commented-code block (7 lines) in js/dashboard/writer.js:23"}, "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-ff3c951d8e184eb1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/writer.js:1213", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/writer.js:1213"}, "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-8e8f02586f0e3212", "name": "Commented-code block (8 lines) in js/dashboard/tasks-admin.js:6", "shortDescription": {"text": "Commented-code block (8 lines) in js/dashboard/tasks-admin.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c567406c8804659", "name": "Commented-code block (5 lines) in js/dashboard/auto-deadlines.js:6", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/auto-deadlines.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c99aad8583046f8", "name": "Commented-code block (5 lines) in js/dashboard/book-reviews-admin.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/book-reviews-admin.js:4"}, "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-b790eba6c5302fac", "name": "Commented-code block (5 lines) in js/dashboard/task-engine.js:308", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/task-engine.js:308"}, "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-3768d4324cc32050", "name": "Commented-code block (5 lines) in js/dashboard/final-review.js:23", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/final-review.js:23"}, "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-c29d32f03886f0d0", "name": "Commented-code block (5 lines) in js/dashboard/admin-import.js:30", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/admin-import.js:30"}, "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-233db3951bea693d", "name": "Commented-code block (5 lines) in js/dashboard/calendar-export.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in js/dashboard/calendar-export.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-64dcc7200278fe3f", "name": "Commented-code block (14 lines) in js/dashboard/planner.js:7", "shortDescription": {"text": "Commented-code block (14 lines) in js/dashboard/planner.js:7"}, "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-51248744b531cbd2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/planner.js:1373", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/planner.js:1373"}, "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-38f6184e7b908c45", "name": "Commented-code block (11 lines) in js/dashboard/schedule-calendar.js:4", "shortDescription": {"text": "Commented-code block (11 lines) in js/dashboard/schedule-calendar.js:4"}, "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-35c46d2dbaf87044", "name": "Commented-code block (7 lines) in js/dashboard/app.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in js/dashboard/app.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d048fa020e579df7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/app.js:872", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/app.js:872"}, "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-5f943542b36c9c1c", "name": "Commented-code block (9 lines) in js/dashboard/book-reviews-writer.js:4", "shortDescription": {"text": "Commented-code block (9 lines) in js/dashboard/book-reviews-writer.js:4"}, "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-be9431e89df815a9", "name": "Commented-code block (7 lines) in js/dashboard/tasks.js:10", "shortDescription": {"text": "Commented-code block (7 lines) in js/dashboard/tasks.js: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-3a4660f3661f2a00", "name": "Commented-code block (6 lines) in js/dashboard/newsletter.js:399", "shortDescription": {"text": "Commented-code block (6 lines) in js/dashboard/newsletter.js:399"}, "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-29daac4ae899a9ae", "name": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/newsletter.js:626", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/newsletter.js:626"}, "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-112af8f7e9131f15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-to-primary-db.mjs:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-to-primary-db.mjs: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-a123610da424f518", "name": "Legacy-named symbol `index_backup` in scripts/extract-hero-frames.js:6", "shortDescription": {"text": "Legacy-named symbol `index_backup` in scripts/extract-hero-frames.js:6"}, "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-3243ef041fd64e1d", "name": "Commented-code block (7 lines) in scripts/extract-hero-frames.js:63", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/extract-hero-frames.js:63"}, "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-744cc44fb907e862", "name": "Commented-code block (5 lines) in scripts/generate-lqip-manifest.js:2", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/generate-lqip-manifest.js:2"}, "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-fd45537c59cca13d", "name": "Legacy-named symbol `index_backup` in scripts/extend-monument-frames.py:24", "shortDescription": {"text": "Legacy-named symbol `index_backup` in scripts/extend-monument-frames.py:24"}, "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-5767a8323b837fa3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/seed-user-names.mjs:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/seed-user-names.mjs:40"}, "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-e3be31eeea0fbde1", "name": "Commented-code block (5 lines) in scripts/backfill-tags.js:42", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/backfill-tags.js:42"}, "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-f05083546ef577b9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-subscribers.mjs:257", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-subscribers.mjs:257"}, "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-c765a3ff40750a14", "name": "Commented-code block (5 lines) in founders-sms-worker/worker.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in founders-sms-worker/worker.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a675b5ea6b201272", "name": "`fetch()` without try/.catch or AbortSignal \u2014 founders-sms-worker/worker.js:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 founders-sms-worker/worker.js:38"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-22cca29518a264b9", "name": "Commented-code block (5 lines) in scheduler/modalFixes_APPLY.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in scheduler/modalFixes_APPLY.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4d7549195d4325e", "name": "Commented-code block (5 lines) in scheduler/calendarExport.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in scheduler/calendarExport.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e69511928c9f989e", "name": "Commented-code block (5 lines) in scheduler/dashboard.js:7047", "shortDescription": {"text": "Commented-code block (5 lines) in scheduler/dashboard.js:7047"}, "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-99529794720072d7", "name": "Commented-code block (6 lines) in scheduler/autoDeadlines.js:7", "shortDescription": {"text": "Commented-code block (6 lines) in scheduler/autoDeadlines.js:7"}, "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-a4ea08167a7483cb", "name": "Commented-code block (5 lines) in scheduler/dashboardHelpers.js:160", "shortDescription": {"text": "Commented-code block (5 lines) in scheduler/dashboardHelpers.js:160"}, "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-98da3ad4461a6804", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scheduler/dashboardHelpers.js:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scheduler/dashboardHelpers.js:23"}, "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-7a0bda467f237d78", "name": "Commented-code block (6 lines) in scheduler/titleEditFix.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in scheduler/titleEditFix.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3671d68ecacad2da", "name": "Dangling fetch: POST https://challenges.cloudflare.com/turnstile/v0/siteverify (functions/api/book-reviews/submit.js:312", "shortDescription": {"text": "Dangling fetch: POST https://challenges.cloudflare.com/turnstile/v0/siteverify (functions/api/book-reviews/submit.js:312)"}, "fullDescription": {"text": "`functions/api/book-reviews/submit.js:312` calls `POST https://challenges.cloudflare.com/turnstile/v0/siteverify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/challenges.cloudflare.com/turnstile/v0/siteverify`\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-7f0727ca9b9f47be", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (functions/_utils/firebase.js:174)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (functions/_utils/firebase.js:174)"}, "fullDescription": {"text": "`functions/_utils/firebase.js:174` 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-a14760f447dfe1f2", "name": "Dangling fetch: POST https://api.resend.com/emails (functions/_utils/resend.js:55)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (functions/_utils/resend.js:55)"}, "fullDescription": {"text": "`functions/_utils/resend.js:55` 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-5cde6dfc5f30fa62", "name": "Dangling fetch: POST https://api.resend.com/emails/batch (functions/_utils/resend.js:91)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails/batch (functions/_utils/resend.js:91)"}, "fullDescription": {"text": "`functions/_utils/resend.js:91` calls `POST https://api.resend.com/emails/batch` 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/batch`\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-b92a7408b6222cf1", "name": "Dangling fetch: POST https://firestore.googleapis.com/v1/projects/${FIRESTORE_PROJECT}/databases/(default)/documents:run", "shortDescription": {"text": "Dangling fetch: POST https://firestore.googleapis.com/v1/projects/${FIRESTORE_PROJECT}/databases/(default)/documents:runQuery (functions/_utils/article-meta.js:309)"}, "fullDescription": {"text": "`functions/_utils/article-meta.js:309` calls `POST https://firestore.googleapis.com/v1/projects/${FIRESTORE_PROJECT}/databases/(default)/documents:runQuery` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/firestore.googleapis.com/v1/projects/<p>/databases/(default)/documents/<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-5705b2b4a9c7eb01", "name": "Dangling fetch: POST https://firestore.googleapis.com/v1/projects/${FIRESTORE_PROJECT}/databases/(default)/documents:run", "shortDescription": {"text": "Dangling fetch: POST https://firestore.googleapis.com/v1/projects/${FIRESTORE_PROJECT}/databases/(default)/documents:runQuery (functions/_utils/article-meta.js:366)"}, "fullDescription": {"text": "`functions/_utils/article-meta.js:366` calls `POST https://firestore.googleapis.com/v1/projects/${FIRESTORE_PROJECT}/databases/(default)/documents:runQuery` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/firestore.googleapis.com/v1/projects/<p>/databases/(default)/documents/<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-8d8883a7c658f155", "name": "Dangling fetch: POST https://api.indexnow.org/IndexNow (functions/_utils/seo-notify.js:31)", "shortDescription": {"text": "Dangling fetch: POST https://api.indexnow.org/IndexNow (functions/_utils/seo-notify.js:31)"}, "fullDescription": {"text": "`functions/_utils/seo-notify.js:31` calls `POST https://api.indexnow.org/IndexNow` 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.indexnow.org/indexnow`\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-60751bb7060ada89", "name": "Dangling fetch: POST https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache (functions/_utils/seo-notify.js:66", "shortDescription": {"text": "Dangling fetch: POST https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache (functions/_utils/seo-notify.js:66)"}, "fullDescription": {"text": "`functions/_utils/seo-notify.js:66` calls `POST https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache` 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.cloudflare.com/client/v4/zones/<p>/purge_cache`\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-69d5f9bd48b96c65", "name": "Dangling fetch: POST /api/publish (js/admin-publish-bridge.js:18)", "shortDescription": {"text": "Dangling fetch: POST /api/publish (js/admin-publish-bridge.js:18)"}, "fullDescription": {"text": "`js/admin-publish-bridge.js:18` calls `POST /api/publish` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/publish`\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-4afc4c579daa1849", "name": "Dangling fetch: POST /api/subscribe (js/newsletter-handler.js:74)", "shortDescription": {"text": "Dangling fetch: POST /api/subscribe (js/newsletter-handler.js:74)"}, "fullDescription": {"text": "`js/newsletter-handler.js:74` calls `POST /api/subscribe` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/subscribe`\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-7fa4117ad63ac2d9", "name": "Dangling fetch: POST /api/analytics/visit (js/main.js:457)", "shortDescription": {"text": "Dangling fetch: POST /api/analytics/visit (js/main.js:457)"}, "fullDescription": {"text": "`js/main.js:457` calls `POST /api/analytics/visit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analytics/visit`\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-e9a7814a1f2ee7ca", "name": "Dangling fetch: POST https://firestore.googleapis.com/v1/projects/${projectId}/databases/(default)/documents:runQuery (j", "shortDescription": {"text": "Dangling fetch: POST https://firestore.googleapis.com/v1/projects/${projectId}/databases/(default)/documents:runQuery (js/main.js:1467)"}, "fullDescription": {"text": "`js/main.js:1467` calls `POST https://firestore.googleapis.com/v1/projects/${projectId}/databases/(default)/documents:runQuery` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/firestore.googleapis.com/v1/projects/<p>/databases/(default)/documents/<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-1f7556123092bfde", "name": "Dangling fetch: GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(clean)}&country=US&maxResult", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(clean)}&country=US&maxResults=1 (js/main.js:1566)"}, "fullDescription": {"text": "`js/main.js:1566` calls `GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(clean)}&country=US&maxResults=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/books/v1/volumes`\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-865d122f6871032d", "name": "Dangling fetch: GET /posts/games/_template.html (js/main.js:2906)", "shortDescription": {"text": "Dangling fetch: GET /posts/games/_template.html (js/main.js:2906)"}, "fullDescription": {"text": "`js/main.js:2906` calls `GET /posts/games/_template.html` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts/games/_template.html`\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-459a12abb79eedd2", "name": "Dangling fetch: GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(isbn)}&country=US&maxResults", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(isbn)}&country=US&maxResults=1 (js/book-reviews.js:1537)"}, "fullDescription": {"text": "`js/book-reviews.js:1537` calls `GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(isbn)}&country=US&maxResults=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/books/v1/volumes`\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-13a3df13e1099413", "name": "Dangling fetch: POST /api/book-reviews/submit (js/book-reviews.js:2099)", "shortDescription": {"text": "Dangling fetch: POST /api/book-reviews/submit (js/book-reviews.js:2099)"}, "fullDescription": {"text": "`js/book-reviews.js:2099` calls `POST /api/book-reviews/submit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/book-reviews/submit`\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-b9d65571c7f1bf11", "name": "Dangling fetch: POST /api/book-reviews/decide (js/dashboard/book-reviews-admin.js:222)", "shortDescription": {"text": "Dangling fetch: POST /api/book-reviews/decide (js/dashboard/book-reviews-admin.js:222)"}, "fullDescription": {"text": "`js/dashboard/book-reviews-admin.js:222` calls `POST /api/book-reviews/decide` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/book-reviews/decide`\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-3b1f443351107c6a", "name": "Dangling fetch: GET /css/styles.css (js/dashboard/final-review.js:250)", "shortDescription": {"text": "Dangling fetch: GET /css/styles.css (js/dashboard/final-review.js:250)"}, "fullDescription": {"text": "`js/dashboard/final-review.js:250` calls `GET /css/styles.css` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/css/styles.css`\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-7138698c7e27a176", "name": "Dangling fetch: GET /css/article-premium.css (js/dashboard/final-review.js:282)", "shortDescription": {"text": "Dangling fetch: GET /css/article-premium.css (js/dashboard/final-review.js:282)"}, "fullDescription": {"text": "`js/dashboard/final-review.js:282` calls `GET /css/article-premium.css` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/css/article-premium.css`\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-b8e7a3a801e0ac3c", "name": "Dangling fetch: GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(clean)}&country=US&maxResult", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(clean)}&country=US&maxResults=1 (js/dashboard/book-reviews-writer.js:727)"}, "fullDescription": {"text": "`js/dashboard/book-reviews-writer.js:727` calls `GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(clean)}&country=US&maxResults=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/books/v1/volumes`\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-a9226c31c6d1b618", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (scripts/migrate-subscribers.mjs:257)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (scripts/migrate-subscribers.mjs:257)"}, "fullDescription": {"text": "`scripts/migrate-subscribers.mjs:257` 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-cccd3a6ce26dc104", "name": "Dangling fetch: POST /api/notify/event (scheduler/dashboardHelpers.js:23)", "shortDescription": {"text": "Dangling fetch: POST /api/notify/event (scheduler/dashboardHelpers.js:23)"}, "fullDescription": {"text": "`scheduler/dashboardHelpers.js:23` calls `POST /api/notify/event` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notify/event`\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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`server.js` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-793ed0e0a15c7d4e", "name": "Unused endpoint: POST /api/publish-article", "shortDescription": {"text": "Unused endpoint: POST /api/publish-article"}, "fullDescription": {"text": "`server.js` declares `POST /api/publish-article` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e1b6da0b193bd494", "name": "Unused endpoint: POST /generate-article.php", "shortDescription": {"text": "Unused endpoint: POST /generate-article.php"}, "fullDescription": {"text": "`server.js` declares `POST /generate-article.php` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c90d4f2fb518f6c", "name": "Unused endpoint: OPTIONS /generate-article.php", "shortDescription": {"text": "Unused endpoint: OPTIONS /generate-article.php"}, "fullDescription": {"text": "`server.js` declares `OPTIONS /generate-article.php` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a96a2fe1099e7e1", "name": "Unused endpoint: POST /api/delete-article", "shortDescription": {"text": "Unused endpoint: POST /api/delete-article"}, "fullDescription": {"text": "`server.js` declares `POST /api/delete-article` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7f16ff40bbd2f2f4", "name": "Unused endpoint: GET /api/image-proxy", "shortDescription": {"text": "Unused endpoint: GET /api/image-proxy"}, "fullDescription": {"text": "`server.js` declares `GET /api/image-proxy` 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/19648"}, "properties": {"repository": "Sillybob123/catalystmagazine", "repoUrl": "https://github.com/Sillybob123/catalystmagazine", "branch": "main"}, "results": [{"ruleId": "scanner-2b061522511c856f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 publish-article.js:346"}, "properties": {"repobilityId": "3afd6bae2d59f42a", "scanner": "scanner-primary", "fingerprint": "2b061522511c856f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-62710ac872692bab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server.js:148"}, "properties": {"repobilityId": "a9deebb5fdc93edc", "scanner": "scanner-primary", "fingerprint": "62710ac872692bab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a859706424be2b9c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/api/newsletter/preview.js:77"}, "properties": {"repobilityId": "4c07d5ed239a0400", "scanner": "scanner-primary", "fingerprint": "a859706424be2b9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78ad2ab59680b1b3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler-worker/worker.js:31"}, "properties": {"repobilityId": "3b870c9d35e007f8", "scanner": "scanner-primary", "fingerprint": "78ad2ab59680b1b3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-03db3182ca794097", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 newsletter-cron-worker/worker.js:32"}, "properties": {"repobilityId": "822da42cf5435221", "scanner": "scanner-primary", "fingerprint": "03db3182ca794097", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0efc85fca1a8a59d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 js/main.js:9"}, "properties": {"repobilityId": "cf1b25f1a6d656fd", "scanner": "scanner-primary", "fingerprint": "0efc85fca1a8a59d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac9e0ab8e83c1cdd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 js/layout.js:301"}, "properties": {"repobilityId": "4c83951e5ce1024e", "scanner": "scanner-primary", "fingerprint": "ac9e0ab8e83c1cdd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8829c3d4fe899cf6", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 js/dashboard/marketing.js:2316"}, "properties": {"repobilityId": "11c6f7257e07f794", "scanner": "scanner-primary", "fingerprint": "8829c3d4fe899cf6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-63491e9085ac39e5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 js/dashboard/marketing.js:618"}, "properties": {"repobilityId": "f0e2002451dad37e", "scanner": "scanner-primary", "fingerprint": "63491e9085ac39e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-03630b44c75589e5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 js/dashboard/newsletter.js:262"}, "properties": {"repobilityId": "9034938ab684deda", "scanner": "scanner-primary", "fingerprint": "03630b44c75589e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a67d574e711594d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 js/widgets/workflow-preview.js:32"}, "properties": {"repobilityId": "7f269e93cb17838c", "scanner": "scanner-primary", "fingerprint": "0a67d574e711594d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b3801f04f4638f15", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-hero-frames.js:84"}, "properties": {"repobilityId": "c3ae69fca769f972", "scanner": "scanner-primary", "fingerprint": "b3801f04f4638f15", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c515cd884c0b45ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-phones.js:91"}, "properties": {"repobilityId": "b76c2bbcb79257d4", "scanner": "scanner-primary", "fingerprint": "c515cd884c0b45ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a08494798b58d10e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-lqip-manifest.js:128"}, "properties": {"repobilityId": "b6c631f443dffc1b", "scanner": "scanner-primary", "fingerprint": "a08494798b58d10e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-17d221976face07c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-cloudflare.js:119"}, "properties": {"repobilityId": "4cf16838e11eb8a5", "scanner": "scanner-primary", "fingerprint": "17d221976face07c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0cda1a0d6049da5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-tags.js:156"}, "properties": {"repobilityId": "ed99a87d571abd78", "scanner": "scanner-primary", "fingerprint": "0cda1a0d6049da5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48defe0fd1145a01", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-json-to-firestore.js:158"}, "properties": {"repobilityId": "2d6de27347d47e65", "scanner": "scanner-primary", "fingerprint": "48defe0fd1145a01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-968c3684abaed3a3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-content-tracker.js:64"}, "properties": {"repobilityId": "e8d60eeda0647016", "scanner": "scanner-primary", "fingerprint": "968c3684abaed3a3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4b6f2a97a63fbefb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 founders-sms-worker/worker.js:30"}, "properties": {"repobilityId": "fa112e109a60cc92", "scanner": "scanner-primary", "fingerprint": "4b6f2a97a63fbefb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-457cf8d5c5ba2658", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/projectState.js:22"}, "properties": {"repobilityId": "eee8406be4adee3a", "scanner": "scanner-primary", "fingerprint": "457cf8d5c5ba2658", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-889c587738fc151d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/startupVerification.js:8"}, "properties": {"repobilityId": "e6784e0af0008299", "scanner": "scanner-primary", "fingerprint": "889c587738fc151d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-feaab7823643514f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/proposalEditFix.js:6"}, "properties": {"repobilityId": "2949c27abcc18a06", "scanner": "scanner-primary", "fingerprint": "feaab7823643514f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-99e5f3457241bb42", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/modalFixes_APPLY.js:7"}, "properties": {"repobilityId": "18100d62fd52459d", "scanner": "scanner-primary", "fingerprint": "99e5f3457241bb42", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-32f73d6033de9af4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/dashboard.js:19"}, "properties": {"repobilityId": "6b480e1091f7cf17", "scanner": "scanner-primary", "fingerprint": "32f73d6033de9af4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ca93ba8e5fa9061", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/auth.js:65"}, "properties": {"repobilityId": "86daa59e8cd251e2", "scanner": "scanner-primary", "fingerprint": "2ca93ba8e5fa9061", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-abe54cc27667aeff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/stateManager.js:17"}, "properties": {"repobilityId": "5099226e9326dc64", "scanner": "scanner-primary", "fingerprint": "abe54cc27667aeff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f55fade31320b541", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/dashboardHelpers.js:32"}, "properties": {"repobilityId": "43016dba0925e3f5", "scanner": "scanner-primary", "fingerprint": "f55fade31320b541", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20b4508e44a8ea0e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/titleEditFix.js:8"}, "properties": {"repobilityId": "df102924bf22f649", "scanner": "scanner-primary", "fingerprint": "20b4508e44a8ea0e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31b06d7d0950127e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/directFormFix.js:6"}, "properties": {"repobilityId": "e7f5b3988d117b31", "scanner": "scanner-primary", "fingerprint": "31b06d7d0950127e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c7683f80ab8fbae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/deadlineFixes_APPLY.js:10"}, "properties": {"repobilityId": "a78c6347b24162a7", "scanner": "scanner-primary", "fingerprint": "9c7683f80ab8fbae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-449171213015acee", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/proposalEditButtons.js:6"}, "properties": {"repobilityId": "51477c280b278068", "scanner": "scanner-primary", "fingerprint": "449171213015acee", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3bddb2c95a32f403", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/fixedSubscriptions.js:20"}, "properties": {"repobilityId": "425e9d0dac28bbd3", "scanner": "scanner-primary", "fingerprint": "3bddb2c95a32f403", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a68994107a95b83", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scheduler/social.js:19"}, "properties": {"repobilityId": "079dc20514521a3f", "scanner": "scanner-primary", "fingerprint": "4a68994107a95b83", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-56818247c562e6c0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in contact.html:418"}, "properties": {"repobilityId": "4dcf46521649b98a", "scanner": "scanner-primary", "fingerprint": "56818247c562e6c0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "contact.html"}, "region": {"startLine": 418}}}]}, {"ruleId": "scanner-d7366b839e9cf7fb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in brain-teaser.html:697"}, "properties": {"repobilityId": "d49da349309c4ffd", "scanner": "scanner-primary", "fingerprint": "d7366b839e9cf7fb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "brain-teaser.html"}, "region": {"startLine": 697}}}]}, {"ruleId": "scanner-ab6292c32cb8ede6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in collaborate.html:1761"}, "properties": {"repobilityId": "a8da9f820509985a", "scanner": "scanner-primary", "fingerprint": "ab6292c32cb8ede6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "collaborate.html"}, "region": {"startLine": 1761}}}]}, {"ruleId": "scanner-ce638793090216fa", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in raffle.html:1271"}, "properties": {"repobilityId": "7aa1058be45034ff", "scanner": "scanner-primary", "fingerprint": "ce638793090216fa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "raffle.html"}, "region": {"startLine": 1271}}}]}, {"ruleId": "scanner-9ab4f9f8522ac1eb", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in server.js:13"}, "properties": {"repobilityId": "0d9bca6c0839725e", "scanner": "scanner-primary", "fingerprint": "9ab4f9f8522ac1eb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.js"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-0f034bace9a7f3cd", "level": "error", "message": {"text": "Possible secret in q7x9m2k5p8wl4n6r1t3vb.html"}, "properties": {"repobilityId": "4545f811ddb751b8", "scanner": "scanner-primary", "fingerprint": "0f034bace9a7f3cd", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "q7x9m2k5p8wl4n6r1t3vb.html"}, "region": {"startLine": 546}}}]}, {"ruleId": "scanner-8614e6ebd17845e2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in q7x9m2k5p8wl4n6r1t3vb.html:594"}, "properties": {"repobilityId": "5e78ea808407a8b0", "scanner": "scanner-primary", "fingerprint": "8614e6ebd17845e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "q7x9m2k5p8wl4n6r1t3vb.html"}, "region": {"startLine": 594}}}]}, {"ruleId": "scanner-db426c7356099a9e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in unsubscribe.html:285"}, "properties": {"repobilityId": "e61b4588f7c94f28", "scanner": "scanner-primary", "fingerprint": "db426c7356099a9e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "unsubscribe.html"}, "region": {"startLine": 285}}}]}, {"ruleId": "scanner-d08c3fb2bf63ba8e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in functions/api/image-proxy.js:87"}, "properties": {"repobilityId": "4b2de5aa12d95b92", "scanner": "scanner-primary", "fingerprint": "d08c3fb2bf63ba8e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "functions/api/image-proxy.js"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-732692f49761ee81", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in functions/_utils/firebase.js:151"}, "properties": {"repobilityId": "ad404d2012c64593", "scanner": "scanner-primary", "fingerprint": "732692f49761ee81", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "functions/_utils/firebase.js"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-6f8b0869b4387958", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article11.html:1532"}, "properties": {"repobilityId": "d3b47dd53865af0e", "scanner": "scanner-primary", "fingerprint": "6f8b0869b4387958", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article11.html"}, "region": {"startLine": 1532}}}]}, {"ruleId": "scanner-f3aa629b6537f448", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article23.html:1496"}, "properties": {"repobilityId": "df4025c582f00beb", "scanner": "scanner-primary", "fingerprint": "f3aa629b6537f448", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article23.html"}, "region": {"startLine": 1496}}}]}, {"ruleId": "scanner-b33b3f94c36aeda1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article17.html:1497"}, "properties": {"repobilityId": "e86438dafb621078", "scanner": "scanner-primary", "fingerprint": "b33b3f94c36aeda1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article17.html"}, "region": {"startLine": 1497}}}]}, {"ruleId": "scanner-161d302f1babca6a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article7.html:678"}, "properties": {"repobilityId": "9ff1fad7296ec4ed", "scanner": "scanner-primary", "fingerprint": "161d302f1babca6a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article7.html"}, "region": {"startLine": 678}}}]}, {"ruleId": "scanner-6e4319806d0887ee", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article29.html:1532"}, "properties": {"repobilityId": "1ce66afce5e366c2", "scanner": "scanner-primary", "fingerprint": "6e4319806d0887ee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article29.html"}, "region": {"startLine": 1532}}}]}, {"ruleId": "scanner-79c91d477063f2ac", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article16.html:1497"}, "properties": {"repobilityId": "e2d1b6d9286f91bf", "scanner": "scanner-primary", "fingerprint": "79c91d477063f2ac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article16.html"}, "region": {"startLine": 1497}}}]}, {"ruleId": "scanner-fd9f9a55b0926d2d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article3.html:679"}, "properties": {"repobilityId": "a8b02a7a0ed094a4", "scanner": "scanner-primary", "fingerprint": "fd9f9a55b0926d2d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article3.html"}, "region": {"startLine": 679}}}]}, {"ruleId": "scanner-d9fb45e694e97b2f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article5.html:677"}, "properties": {"repobilityId": "ba152c106009f086", "scanner": "scanner-primary", "fingerprint": "d9fb45e694e97b2f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article5.html"}, "region": {"startLine": 677}}}]}, {"ruleId": "scanner-ade657ee7e10d442", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article8.html:652"}, "properties": {"repobilityId": "5b285391ab8997b4", "scanner": "scanner-primary", "fingerprint": "ade657ee7e10d442", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article8.html"}, "region": {"startLine": 652}}}]}, {"ruleId": "scanner-5373dd15a49bf5b5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article22.html:1497"}, "properties": {"repobilityId": "abbaade560fa2b26", "scanner": "scanner-primary", "fingerprint": "5373dd15a49bf5b5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article22.html"}, "region": {"startLine": 1497}}}]}, {"ruleId": "scanner-1eedad51e6a03b70", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article2.html:679"}, "properties": {"repobilityId": "fc1cfa583930090a", "scanner": "scanner-primary", "fingerprint": "1eedad51e6a03b70", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article2.html"}, "region": {"startLine": 679}}}]}, {"ruleId": "scanner-6a92cc001ee04447", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article33.html:1532"}, "properties": {"repobilityId": "653d5020db08aabf", "scanner": "scanner-primary", "fingerprint": "6a92cc001ee04447", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article33.html"}, "region": {"startLine": 1532}}}]}, {"ruleId": "scanner-05ab49a9535a6cec", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article27.html:1532"}, "properties": {"repobilityId": "2d501047f78f5101", "scanner": "scanner-primary", "fingerprint": "05ab49a9535a6cec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article27.html"}, "region": {"startLine": 1532}}}]}, {"ruleId": "scanner-6f063a921312f1f3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article25.html:1496"}, "properties": {"repobilityId": "3369ddebbada7451", "scanner": "scanner-primary", "fingerprint": "6f063a921312f1f3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article25.html"}, "region": {"startLine": 1496}}}]}, {"ruleId": "scanner-d6a000cb4e592256", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article20.html:1497"}, "properties": {"repobilityId": "37e21ed4db751ec9", "scanner": "scanner-primary", "fingerprint": "d6a000cb4e592256", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article20.html"}, "region": {"startLine": 1497}}}]}, {"ruleId": "scanner-4eea8e412655aac5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article26.html:1532"}, "properties": {"repobilityId": "e623151a48ad39f5", "scanner": "scanner-primary", "fingerprint": "4eea8e412655aac5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article26.html"}, "region": {"startLine": 1532}}}]}, {"ruleId": "scanner-6b4df4365c39cb02", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article31.html:1574"}, "properties": {"repobilityId": "dfae4ec789dd7989", "scanner": "scanner-primary", "fingerprint": "6b4df4365c39cb02", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article31.html"}, "region": {"startLine": 1574}}}]}, {"ruleId": "scanner-c4cad255232b94a7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article15.html:1497"}, "properties": {"repobilityId": "d6f56556f66a2852", "scanner": "scanner-primary", "fingerprint": "c4cad255232b94a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article15.html"}, "region": {"startLine": 1497}}}]}, {"ruleId": "scanner-01e8f3c9477c7591", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article4.html:677"}, "properties": {"repobilityId": "e345e69038516fe6", "scanner": "scanner-primary", "fingerprint": "01e8f3c9477c7591", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article4.html"}, "region": {"startLine": 677}}}]}, {"ruleId": "scanner-28d5f0ae49bac6ff", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article13.html:1532"}, "properties": {"repobilityId": "3b18c19298ec96e0", "scanner": "scanner-primary", "fingerprint": "28d5f0ae49bac6ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article13.html"}, "region": {"startLine": 1532}}}]}, {"ruleId": "scanner-f262631be89d4094", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article30.html:1616"}, "properties": {"repobilityId": "7111a7d071fd2dc2", "scanner": "scanner-primary", "fingerprint": "f262631be89d4094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article30.html"}, "region": {"startLine": 1616}}}]}, {"ruleId": "scanner-6b4618cd13d689e4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article12.html:1532"}, "properties": {"repobilityId": "7cf10fc1acecdae1", "scanner": "scanner-primary", "fingerprint": "6b4618cd13d689e4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article12.html"}, "region": {"startLine": 1532}}}]}, {"ruleId": "scanner-4cb3ef99be6a03e9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article18.html:1496"}, "properties": {"repobilityId": "e58b3836a09624a0", "scanner": "scanner-primary", "fingerprint": "4cb3ef99be6a03e9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article18.html"}, "region": {"startLine": 1496}}}]}, {"ruleId": "scanner-1aa6df01e7573e64", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article19.html:1496"}, "properties": {"repobilityId": "2f3fd60f64afdc7d", "scanner": "scanner-primary", "fingerprint": "1aa6df01e7573e64", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article19.html"}, "region": {"startLine": 1496}}}]}, {"ruleId": "scanner-8b2062efe17354ed", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article14.html:1497"}, "properties": {"repobilityId": "9116193e23bde664", "scanner": "scanner-primary", "fingerprint": "8b2062efe17354ed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article14.html"}, "region": {"startLine": 1497}}}]}, {"ruleId": "scanner-8ce6ca2c3172213d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article21.html:1485"}, "properties": {"repobilityId": "198bb5ecc1dc818b", "scanner": "scanner-primary", "fingerprint": "8ce6ca2c3172213d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article21.html"}, "region": {"startLine": 1485}}}]}, {"ruleId": "scanner-89840e7f4ada421d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article10.html:1532"}, "properties": {"repobilityId": "545d7589dd6a9093", "scanner": "scanner-primary", "fingerprint": "89840e7f4ada421d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article10.html"}, "region": {"startLine": 1532}}}]}, {"ruleId": "scanner-7700bbcb865827c7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article9.html:677"}, "properties": {"repobilityId": "2690bc00ca3c80d6", "scanner": "scanner-primary", "fingerprint": "7700bbcb865827c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article9.html"}, "region": {"startLine": 677}}}]}, {"ruleId": "scanner-7b1d2f17a58935c3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article6.html:677"}, "properties": {"repobilityId": "d377e3c51bdc4a48", "scanner": "scanner-primary", "fingerprint": "7b1d2f17a58935c3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article6.html"}, "region": {"startLine": 677}}}]}, {"ruleId": "scanner-107b5eb6fafd26a9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article24.html:1497"}, "properties": {"repobilityId": "ae9ed71e038a0ad0", "scanner": "scanner-primary", "fingerprint": "107b5eb6fafd26a9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article24.html"}, "region": {"startLine": 1497}}}]}, {"ruleId": "scanner-9f46c77079ec1191", "level": "note", "message": {"text": "Insecure pattern 'document_write' in posts/games/article32.html:174"}, "properties": {"repobilityId": "bc2963f9790c3ee2", "scanner": "scanner-primary", "fingerprint": "9f46c77079ec1191", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article32.html"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-01f13ff0baaec62f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in posts/games/article32.html:2004"}, "properties": {"repobilityId": "1c97221b024c6543", "scanner": "scanner-primary", "fingerprint": "01f13ff0baaec62f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "posts/games/article32.html"}, "region": {"startLine": 2004}}}]}, {"ruleId": "scanner-8075f7eaec821136", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/glossary.js:121"}, "properties": {"repobilityId": "c509cafb384ccc15", "scanner": "scanner-primary", "fingerprint": "8075f7eaec821136", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/glossary.js"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-cd6789535d67fe7d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/newsletter-handler.js:69"}, "properties": {"repobilityId": "7996ef0d8c0ba1f0", "scanner": "scanner-primary", "fingerprint": "cd6789535d67fe7d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/newsletter-handler.js"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-a52f7bd767fee1ca", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/studio-editor.js:236"}, "properties": {"repobilityId": "d8498cb566317be5", "scanner": "scanner-primary", "fingerprint": "a52f7bd767fee1ca", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/studio-editor.js"}, "region": {"startLine": 236}}}]}, {"ruleId": "scanner-53fc65554f63400d", "level": "error", "message": {"text": "Possible secret in js/firebase-config.js"}, "properties": {"repobilityId": "64abd1e1859b1a9b", "scanner": "scanner-primary", "fingerprint": "53fc65554f63400d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/firebase-config.js"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-f04d9c8257a5cc71", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/articles-new.js:359"}, "properties": {"repobilityId": "eba76ac1beb39a28", "scanner": "scanner-primary", "fingerprint": "f04d9c8257a5cc71", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/articles-new.js"}, "region": {"startLine": 359}}}]}, {"ruleId": "scanner-144060d58947da4d", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in js/articles-new.js:484"}, "properties": {"repobilityId": "16234da282267637", "scanner": "scanner-primary", "fingerprint": "144060d58947da4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/articles-new.js"}, "region": {"startLine": 484}}}]}, {"ruleId": "scanner-6e6eb8f55a8baca6", "level": "error", "message": {"text": "Possible secret in js/firebase-dual-config.js"}, "properties": {"repobilityId": "87451b6e8183d29d", "scanner": "scanner-primary", "fingerprint": "6e6eb8f55a8baca6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/firebase-dual-config.js"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-faebedda96c631c9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/main.js:489"}, "properties": {"repobilityId": "3b23e0cd41b5e603", "scanner": "scanner-primary", "fingerprint": "faebedda96c631c9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/main.js"}, "region": {"startLine": 489}}}]}, {"ruleId": "scanner-3b262d7d183cea73", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in js/main.js:2509"}, "properties": {"repobilityId": "b539e03372d0ddcf", "scanner": "scanner-primary", "fingerprint": "3b262d7d183cea73", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/main.js"}, "region": {"startLine": 2509}}}]}, {"ruleId": "scanner-70ac916cf474d4b5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/layout.js:77"}, "properties": {"repobilityId": "6b4e4b2683c5c2c7", "scanner": "scanner-primary", "fingerprint": "70ac916cf474d4b5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/layout.js"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-fb3269dab55249a6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/book-reviews.js:441"}, "properties": {"repobilityId": "fcee9a6f60542ec2", "scanner": "scanner-primary", "fingerprint": "fb3269dab55249a6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/book-reviews.js"}, "region": {"startLine": 441}}}]}, {"ruleId": "scanner-af79f69da7ac7092", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in js/book-reviews.js:1469"}, "properties": {"repobilityId": "712771ea0aea5e42", "scanner": "scanner-primary", "fingerprint": "af79f69da7ac7092", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/book-reviews.js"}, "region": {"startLine": 1469}}}]}, {"ruleId": "scanner-108ff1f6cd416434", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/overview.js:19"}, "properties": {"repobilityId": "f9b265b8867f1b3a", "scanner": "scanner-primary", "fingerprint": "108ff1f6cd416434", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/overview.js"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-3756a2ba4b6f5ab9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/guidelines.js:414"}, "properties": {"repobilityId": "044d084372e8d02a", "scanner": "scanner-primary", "fingerprint": "3756a2ba4b6f5ab9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/guidelines.js"}, "region": {"startLine": 414}}}]}, {"ruleId": "scanner-de57f22aa475d627", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/games.js:29"}, "properties": {"repobilityId": "5b95f14ab7278171", "scanner": "scanner-primary", "fingerprint": "de57f22aa475d627", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/games.js"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-d18677c815edacb2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/activity.js:44"}, "properties": {"repobilityId": "491b2076ba7e38d4", "scanner": "scanner-primary", "fingerprint": "d18677c815edacb2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/activity.js"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-d67cdf1c3374b915", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/searchability.js:89"}, "properties": {"repobilityId": "b73875237319c993", "scanner": "scanner-primary", "fingerprint": "d67cdf1c3374b915", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/searchability.js"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-fefd111586ca4bdd", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in js/dashboard/searchability.js:2074"}, "properties": {"repobilityId": "c22a3640033024d6", "scanner": "scanner-primary", "fingerprint": "fefd111586ca4bdd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/searchability.js"}, "region": {"startLine": 2074}}}]}, {"ruleId": "scanner-7ee1433ad281e71f", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in js/dashboard/searchability.js:2076"}, "properties": {"repobilityId": "720d45a071fe8d06", "scanner": "scanner-primary", "fingerprint": "7ee1433ad281e71f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/searchability.js"}, "region": {"startLine": 2076}}}]}, {"ruleId": "scanner-48d9c9623db70b25", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/submissions.js:39"}, "properties": {"repobilityId": "7fa42643d92e9955", "scanner": "scanner-primary", "fingerprint": "48d9c9623db70b25", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/submissions.js"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-a1f823144c166018", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/admin.js:19"}, "properties": {"repobilityId": "0d503d01dbb8a108", "scanner": "scanner-primary", "fingerprint": "a1f823144c166018", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/admin.js"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-f1c30d5923240f78", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/marketing.js:8"}, "properties": {"repobilityId": "9298e9df926d4111", "scanner": "scanner-primary", "fingerprint": "f1c30d5923240f78", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/marketing.js"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-e964bc69638cdffb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/writer.js:46"}, "properties": {"repobilityId": "b6be4f36b587605c", "scanner": "scanner-primary", "fingerprint": "e964bc69638cdffb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/writer.js"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-ad8e525464757cfc", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in js/dashboard/writer.js:2176"}, "properties": {"repobilityId": "320be54892859ad4", "scanner": "scanner-primary", "fingerprint": "ad8e525464757cfc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/writer.js"}, "region": {"startLine": 2176}}}]}, {"ruleId": "scanner-17dc707ec828ca4d", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in js/dashboard/writer.js:1257"}, "properties": {"repobilityId": "566813453a59e4b3", "scanner": "scanner-primary", "fingerprint": "17dc707ec828ca4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/writer.js"}, "region": {"startLine": 1257}}}]}, {"ruleId": "scanner-c9fdbdd34a1b5b80", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/pipeline.js:134"}, "properties": {"repobilityId": "13d793aab759eb3c", "scanner": "scanner-primary", "fingerprint": "c9fdbdd34a1b5b80", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/pipeline.js"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-a575a34b9ef837d0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/ui.js:10"}, "properties": {"repobilityId": "76f327de9ae17773", "scanner": "scanner-primary", "fingerprint": "a575a34b9ef837d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/ui.js"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-41384eca1508ac31", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/tasks-admin.js:40"}, "properties": {"repobilityId": "c24dbcaf7b706d1d", "scanner": "scanner-primary", "fingerprint": "41384eca1508ac31", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/tasks-admin.js"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-53f0bb79bc0e93fa", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/book-reviews-admin.js:26"}, "properties": {"repobilityId": "a83293694d6c4508", "scanner": "scanner-primary", "fingerprint": "53f0bb79bc0e93fa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/book-reviews-admin.js"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-4a40fca614c5e94b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/task-engine.js:561"}, "properties": {"repobilityId": "742c7f67c77c0d0a", "scanner": "scanner-primary", "fingerprint": "4a40fca614c5e94b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/task-engine.js"}, "region": {"startLine": 561}}}]}, {"ruleId": "scanner-a5c66b6ac84befcf", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/final-review.js:36"}, "properties": {"repobilityId": "a9f78a1c2dbf5117", "scanner": "scanner-primary", "fingerprint": "a5c66b6ac84befcf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/final-review.js"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-2d994a9cce876b38", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/directory.js:43"}, "properties": {"repobilityId": "d0dd9a5dfb86f9fd", "scanner": "scanner-primary", "fingerprint": "2d994a9cce876b38", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/directory.js"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-5bf8b223bfa47dec", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/notifications.js:133"}, "properties": {"repobilityId": "46ad241a26a6a177", "scanner": "scanner-primary", "fingerprint": "5bf8b223bfa47dec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/notifications.js"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-4ee51623d15131d9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/admin-import.js:95"}, "properties": {"repobilityId": "5df5933afa29b7e0", "scanner": "scanner-primary", "fingerprint": "4ee51623d15131d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/admin-import.js"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-084b5faf4f75cad1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/calendar-export.js:337"}, "properties": {"repobilityId": "341049f9e93cbacf", "scanner": "scanner-primary", "fingerprint": "084b5faf4f75cad1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/calendar-export.js"}, "region": {"startLine": 337}}}]}, {"ruleId": "scanner-88f7fb0eda6d6fc5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/planner.js:218"}, "properties": {"repobilityId": "50d09a58569541be", "scanner": "scanner-primary", "fingerprint": "88f7fb0eda6d6fc5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/planner.js"}, "region": {"startLine": 218}}}]}, {"ruleId": "scanner-7ec1f84138bc6097", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/schedule-calendar.js:484"}, "properties": {"repobilityId": "5a8ffad77701d96e", "scanner": "scanner-primary", "fingerprint": "7ec1f84138bc6097", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/schedule-calendar.js"}, "region": {"startLine": 484}}}]}, {"ruleId": "scanner-33f000ebb9e0ed95", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/app.js:508"}, "properties": {"repobilityId": "b87e36d75a59f614", "scanner": "scanner-primary", "fingerprint": "33f000ebb9e0ed95", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/app.js"}, "region": {"startLine": 508}}}]}, {"ruleId": "scanner-f7a7a7fea21bc6eb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/book-reviews-writer.js:36"}, "properties": {"repobilityId": "bb3fd4f56b7a8037", "scanner": "scanner-primary", "fingerprint": "f7a7a7fea21bc6eb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/book-reviews-writer.js"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-efb6459417b7233a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/tasks.js:128"}, "properties": {"repobilityId": "afd2fc73de499e71", "scanner": "scanner-primary", "fingerprint": "efb6459417b7233a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/tasks.js"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-bedd5c6632d1739a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/newsletter.js:9"}, "properties": {"repobilityId": "f3671bd88758453a", "scanner": "scanner-primary", "fingerprint": "bedd5c6632d1739a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/newsletter.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-9210477e83373a19", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dashboard/editor.js:29"}, "properties": {"repobilityId": "07fc4444743043bd", "scanner": "scanner-primary", "fingerprint": "9210477e83373a19", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dashboard/editor.js"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-729cacc2c871e6f0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/widgets/workflow-preview.js:115"}, "properties": {"repobilityId": "52aae60754946e5d", "scanner": "scanner-primary", "fingerprint": "729cacc2c871e6f0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/widgets/workflow-preview.js"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-e6857aa4aceb7be2", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/extract-hero-frames.js:26"}, "properties": {"repobilityId": "0a61e4a949729d61", "scanner": "scanner-primary", "fingerprint": "e6857aa4aceb7be2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/extract-hero-frames.js"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-8d9f2c39686d672c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin/users.html:431"}, "properties": {"repobilityId": "7a93b21705ba08a4", "scanner": "scanner-primary", "fingerprint": "8d9f2c39686d672c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "admin/users.html"}, "region": {"startLine": 431}}}]}, {"ruleId": "scanner-46fec315fa5017e4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in tools/bundle-shim/bundle.js:3"}, "properties": {"repobilityId": "c0e60185e3377237", "scanner": "scanner-primary", "fingerprint": "46fec315fa5017e4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/bundle-shim/bundle.js"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-159be4d33e064731", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/dashboard.html:834"}, "properties": {"repobilityId": "982ce3ec9e5d3eb4", "scanner": "scanner-primary", "fingerprint": "159be4d33e064731", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/dashboard.html"}, "region": {"startLine": 834}}}]}, {"ruleId": "scanner-2844d2451cf7786f", "level": "error", "message": {"text": "Possible secret in scheduler/dashboard.js"}, "properties": {"repobilityId": "164521cbcd033fa4", "scanner": "scanner-primary", "fingerprint": "2844d2451cf7786f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/dashboard.js"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-5d24c3f288129287", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/dashboard.js:529"}, "properties": {"repobilityId": "d6fbd36058d2de7e", "scanner": "scanner-primary", "fingerprint": "5d24c3f288129287", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/dashboard.js"}, "region": {"startLine": 529}}}]}, {"ruleId": "scanner-9042c65425bb74c5", "level": "error", "message": {"text": "Possible secret in scheduler/auth.js"}, "properties": {"repobilityId": "23a0e91780b5bd92", "scanner": "scanner-primary", "fingerprint": "9042c65425bb74c5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/auth.js"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-9554d48b5cde51cb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/debugConsole.js:10"}, "properties": {"repobilityId": "45b01859088dfbd0", "scanner": "scanner-primary", "fingerprint": "9554d48b5cde51cb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/debugConsole.js"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-8a19aca1bd078f61", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/dashboardHelpers.js:492"}, "properties": {"repobilityId": "bfdb4fa314ea2aea", "scanner": "scanner-primary", "fingerprint": "8a19aca1bd078f61", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/dashboardHelpers.js"}, "region": {"startLine": 492}}}]}, {"ruleId": "scanner-9f69ce995f9ecb8b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/deadlineFixes_APPLY.js:201"}, "properties": {"repobilityId": "f82a1a97f0f588b2", "scanner": "scanner-primary", "fingerprint": "9f69ce995f9ecb8b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/deadlineFixes_APPLY.js"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-d7bf2ac2fe03e6f8", "level": "error", "message": {"text": "Possible secret in scheduler/social.js"}, "properties": {"repobilityId": "e7313d923585dd10", "scanner": "scanner-primary", "fingerprint": "d7bf2ac2fe03e6f8", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/social.js"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-4bd974a0fa703c69", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scheduler/social.js:417"}, "properties": {"repobilityId": "9f7e85e12fb7fda7", "scanner": "scanner-primary", "fingerprint": "4bd974a0fa703c69", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/social.js"}, "region": {"startLine": 417}}}]}, {"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-b38b62b24378e86a", "level": "note", "message": {"text": "Very large file: functions/api/bot/run.js (1369 lines)"}, "properties": {"repobilityId": "91038d3b0da955c9", "scanner": "scanner-primary", "fingerprint": "b38b62b24378e86a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-58c96f4bb385c756", "level": "note", "message": {"text": "Very large file: functions/_utils/reminder-emails.js (1804 lines)"}, "properties": {"repobilityId": "e0539b091410ae2d", "scanner": "scanner-primary", "fingerprint": "58c96f4bb385c756", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9a982ad03534fd8f", "level": "note", "message": {"text": "Very large file: js/main.js (4444 lines)"}, "properties": {"repobilityId": "dc93415c7f49ba3d", "scanner": "scanner-primary", "fingerprint": "9a982ad03534fd8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-233507c4e7b60400", "level": "note", "message": {"text": "Very large file: js/book-reviews.js (2177 lines)"}, "properties": {"repobilityId": "559bb4665157c5fc", "scanner": "scanner-primary", "fingerprint": "233507c4e7b60400", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-979c7eb55bd8d0fc", "level": "note", "message": {"text": "Very large file: js/dashboard/searchability.js (3003 lines)"}, "properties": {"repobilityId": "57da356f8d19eecb", "scanner": "scanner-primary", "fingerprint": "979c7eb55bd8d0fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-54a4f8cb8c65dc78", "level": "note", "message": {"text": "Very large file: js/dashboard/admin.js (1792 lines)"}, "properties": {"repobilityId": "d723556b6e1bfb0d", "scanner": "scanner-primary", "fingerprint": "54a4f8cb8c65dc78", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-73ffe55b690ded82", "level": "note", "message": {"text": "Very large file: js/dashboard/marketing.js (3945 lines)"}, "properties": {"repobilityId": "2ef62a6884519b78", "scanner": "scanner-primary", "fingerprint": "73ffe55b690ded82", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-11684e2cc583b809", "level": "note", "message": {"text": "Very large file: js/dashboard/writer.js (3551 lines)"}, "properties": {"repobilityId": "e8249aa6f629bf65", "scanner": "scanner-primary", "fingerprint": "11684e2cc583b809", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ebd52d5c99d9a138", "level": "note", "message": {"text": "Very large file: js/dashboard/pipeline.js (1549 lines)"}, "properties": {"repobilityId": "dfaf04f36a55bbb7", "scanner": "scanner-primary", "fingerprint": "ebd52d5c99d9a138", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-77670c495c95a461", "level": "note", "message": {"text": "Very large file: js/dashboard/admin-import.js (1817 lines)"}, "properties": {"repobilityId": "81840921b588eecd", "scanner": "scanner-primary", "fingerprint": "77670c495c95a461", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ecb184b0e95499e4", "level": "note", "message": {"text": "Very large file: js/dashboard/planner.js (1568 lines)"}, "properties": {"repobilityId": "a6bc0032fef97b4c", "scanner": "scanner-primary", "fingerprint": "ecb184b0e95499e4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e5cbe376d2d90f0c", "level": "note", "message": {"text": "Very large file: js/dashboard/schedule-calendar.js (1151 lines)"}, "properties": {"repobilityId": "ba351c69ffd2453f", "scanner": "scanner-primary", "fingerprint": "e5cbe376d2d90f0c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-77028133deeb7024", "level": "note", "message": {"text": "Very large file: js/dashboard/app.js (1346 lines)"}, "properties": {"repobilityId": "b213bc47e0f9b68a", "scanner": "scanner-primary", "fingerprint": "77028133deeb7024", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e164d1b28ebde061", "level": "note", "message": {"text": "Very large file: scheduler/dashboard.js (7435 lines)"}, "properties": {"repobilityId": "61069777a36cfa26", "scanner": "scanner-primary", "fingerprint": "e164d1b28ebde061", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "37c7721ba5d79cfc", "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": "895e8a064db9a660", "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": "184eabea7e8656dc", "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": "383a185f0cf6a948", "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": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "68b62f19997076b3", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "3da53d478c1a4e29", "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": "289e34201903ba0d", "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": "ba634476c7efe19b", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e33718ffa1857ba2", "level": "none", "message": {"text": "Commented-code block (11 lines) in publish-article.js:414"}, "properties": {"repobilityId": "9d49d50d1b643792", "scanner": "scanner-primary", "fingerprint": "e33718ffa1857ba2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b190c772f479de0c", "level": "none", "message": {"text": "Commented-code block (6 lines) in functions/api/image-proxy.js:1"}, "properties": {"repobilityId": "62013e8c0b6c20f7", "scanner": "scanner-primary", "fingerprint": "b190c772f479de0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c83a34dacd026232", "level": "none", "message": {"text": "Commented-code block (6 lines) in functions/api/publish.js:5"}, "properties": {"repobilityId": "4c1702b76a4edee5", "scanner": "scanner-primary", "fingerprint": "c83a34dacd026232", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b1174ed40338aa7", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/api/welcome-email.js:5"}, "properties": {"repobilityId": "b291ded3bf31ed95", "scanner": "scanner-primary", "fingerprint": "6b1174ed40338aa7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-055eff6236c1af12", "level": "none", "message": {"text": "Commented-code block (7 lines) in functions/api/bot/founders-sms.js:35"}, "properties": {"repobilityId": "8f22786cc0208f5e", "scanner": "scanner-primary", "fingerprint": "055eff6236c1af12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef9adf9f67a457cb", "level": "none", "message": {"text": "Commented-code block (10 lines) in functions/api/bot/run.js:11"}, "properties": {"repobilityId": "ae34fe4f398066d9", "scanner": "scanner-primary", "fingerprint": "ef9adf9f67a457cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1c47dd22b0c8591", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/api/notify/event.js:112"}, "properties": {"repobilityId": "d0e451634b6b37a3", "scanner": "scanner-primary", "fingerprint": "b1c47dd22b0c8591", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cfd35423ef4aed24", "level": "none", "message": {"text": "Commented-code block (7 lines) in functions/api/notify/published.js:8"}, "properties": {"repobilityId": "b53d093f6cafc542", "scanner": "scanner-primary", "fingerprint": "cfd35423ef4aed24", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5147f6fe2f79accd", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/api/notify/dm.js:3"}, "properties": {"repobilityId": "325ead4c6dd048b4", "scanner": "scanner-primary", "fingerprint": "5147f6fe2f79accd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-793672d59fbd92d5", "level": "none", "message": {"text": "Commented-code block (14 lines) in functions/api/analytics/visit.js:6"}, "properties": {"repobilityId": "2e8377fa3fab5534", "scanner": "scanner-primary", "fingerprint": "793672d59fbd92d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1438f457ea4222ca", "level": "none", "message": {"text": "Commented-code block (6 lines) in functions/api/tasks/notify.js:3"}, "properties": {"repobilityId": "2b743dde3497579f", "scanner": "scanner-primary", "fingerprint": "1438f457ea4222ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13601e829c74e79e", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/api/admin/submissions.js:3"}, "properties": {"repobilityId": "d16d1f43769432af", "scanner": "scanner-primary", "fingerprint": "13601e829c74e79e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42571ef4233a4f24", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/api/searchability/query.js:1"}, "properties": {"repobilityId": "8b2ea0eb092eb401", "scanner": "scanner-primary", "fingerprint": "42571ef4233a4f24", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fdaa3ae94f7fe91", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/api/searchability/query.js:74"}, "properties": {"repobilityId": "f9184c443ce8b76e", "scanner": "scanner-primary", "fingerprint": "5fdaa3ae94f7fe91", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d653a425edbcb01f", "level": "none", "message": {"text": "Commented-code block (17 lines) in functions/api/book-reviews/submit.js:14"}, "properties": {"repobilityId": "90afe54fb88064a8", "scanner": "scanner-primary", "fingerprint": "d653a425edbcb01f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-195ddec13533ee43", "level": "none", "message": {"text": "Commented-code block (13 lines) in functions/api/book-reviews/decide.js:6"}, "properties": {"repobilityId": "d41706d806cf4757", "scanner": "scanner-primary", "fingerprint": "195ddec13533ee43", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5008ffac3ec38ffb", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/api/newsletter/preview.js:5"}, "properties": {"repobilityId": "c6b3fde348df0b2d", "scanner": "scanner-primary", "fingerprint": "5008ffac3ec38ffb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40f519136c0a356e", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/api/newsletter/dispatch-due.js:1"}, "properties": {"repobilityId": "1aec8cbc997eccc5", "scanner": "scanner-primary", "fingerprint": "40f519136c0a356e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-863d2fb51566cd31", "level": "none", "message": {"text": "Commented-code block (8 lines) in functions/api/newsletter/send.js:6"}, "properties": {"repobilityId": "698bc31450b997c2", "scanner": "scanner-primary", "fingerprint": "863d2fb51566cd31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba672b5fd0500d6d", "level": "none", "message": {"text": "Commented-code block (6 lines) in functions/api/calendar/notify.js:3"}, "properties": {"repobilityId": "1c5b3be383f5c7c2", "scanner": "scanner-primary", "fingerprint": "ba672b5fd0500d6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-089608820f461fca", "level": "none", "message": {"text": "Commented-code block (9 lines) in functions/book-review/[slug].js:5"}, "properties": {"repobilityId": "be0b5b205367bf77", "scanner": "scanner-primary", "fingerprint": "089608820f461fca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31bf9b266dfcb900", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/book-review/[slug].js:73"}, "properties": {"repobilityId": "45fb3de640ce4a28", "scanner": "scanner-primary", "fingerprint": "31bf9b266dfcb900", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2b43a6e00ba08064", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/_utils/firebase.js:52"}, "properties": {"repobilityId": "b29f518ae6ed66ca", "scanner": "scanner-primary", "fingerprint": "2b43a6e00ba08064", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1eb873bdc9b1ab92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/_utils/firebase.js:19"}, "properties": {"repobilityId": "bccf140a3a7882bb", "scanner": "scanner-primary", "fingerprint": "1eb873bdc9b1ab92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-99fcfa96714b840e", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/_utils/reminder-emails.js:1104"}, "properties": {"repobilityId": "6634f5f426778fee", "scanner": "scanner-primary", "fingerprint": "99fcfa96714b840e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4b335520b1d2ba0", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/_utils/bot-logic.js:6"}, "properties": {"repobilityId": "72d9d6acbf49a86c", "scanner": "scanner-primary", "fingerprint": "b4b335520b1d2ba0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6dc26c96d442618b", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/_utils/resend.js:5"}, "properties": {"repobilityId": "314aabedcd6927a7", "scanner": "scanner-primary", "fingerprint": "6dc26c96d442618b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f35ca3639beee73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/_utils/resend.js:55"}, "properties": {"repobilityId": "b42b32870da00d11", "scanner": "scanner-primary", "fingerprint": "9f35ca3639beee73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ca6e3451312e276a", "level": "none", "message": {"text": "Commented-code block (10 lines) in functions/_utils/notifications.js:9"}, "properties": {"repobilityId": "123ce56ca4c8d43d", "scanner": "scanner-primary", "fingerprint": "ca6e3451312e276a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f6a069b3f6276ea", "level": "none", "message": {"text": "Commented-code block (6 lines) in functions/_utils/article-meta.js:396"}, "properties": {"repobilityId": "cd381ddfd8503281", "scanner": "scanner-primary", "fingerprint": "1f6a069b3f6276ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06b56f3de359e468", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/_utils/article-meta.js:309"}, "properties": {"repobilityId": "61059adacb63f63b", "scanner": "scanner-primary", "fingerprint": "06b56f3de359e468", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ac517b87a44d911", "level": "none", "message": {"text": "Commented-code block (7 lines) in functions/_utils/seo-notify.js:3"}, "properties": {"repobilityId": "f0151df2888cfcb4", "scanner": "scanner-primary", "fingerprint": "0ac517b87a44d911", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1a4dfe1d7687645", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/_utils/newsletter-template.js:1"}, "properties": {"repobilityId": "d80c69a064c77d33", "scanner": "scanner-primary", "fingerprint": "f1a4dfe1d7687645", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e491244840ef6c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/_utils/task-emails.js:3"}, "properties": {"repobilityId": "96c10c8d5b354511", "scanner": "scanner-primary", "fingerprint": "9e491244840ef6c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94288655510ae2ed", "level": "none", "message": {"text": "Commented-code block (6 lines) in functions/article/[slug].js:3"}, "properties": {"repobilityId": "913cdb273d9a14e7", "scanner": "scanner-primary", "fingerprint": "94288655510ae2ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-210e78785901e3fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 functions/article/[slug].js:71"}, "properties": {"repobilityId": "5cee933e46c8e37c", "scanner": "scanner-primary", "fingerprint": "210e78785901e3fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-80ce339ec0cd2e33", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scheduler-worker/worker.js:39"}, "properties": {"repobilityId": "d8a139056611bdc6", "scanner": "scanner-primary", "fingerprint": "80ce339ec0cd2e33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b04688b24f4aab6", "level": "none", "message": {"text": "Commented-code block (5 lines) in newsletter-cron-worker/worker.js:7"}, "properties": {"repobilityId": "d7585cd4c2df1527", "scanner": "scanner-primary", "fingerprint": "8b04688b24f4aab6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-07aff1eacab1a7a8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 newsletter-cron-worker/worker.js:40"}, "properties": {"repobilityId": "a48411d475a1df3f", "scanner": "scanner-primary", "fingerprint": "07aff1eacab1a7a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07c13be721253325", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/admin-publish-bridge.js:1"}, "properties": {"repobilityId": "cf1dd412ea5056d3", "scanner": "scanner-primary", "fingerprint": "07c13be721253325", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd4abbda5ae559a0", "level": "none", "message": {"text": "Commented-code block (9 lines) in js/studio-editor.js:1"}, "properties": {"repobilityId": "33beddd77b71b74e", "scanner": "scanner-primary", "fingerprint": "cd4abbda5ae559a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff8ea83e00561470", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/image-utils.js:13"}, "properties": {"repobilityId": "b9949d289ada7315", "scanner": "scanner-primary", "fingerprint": "ff8ea83e00561470", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d99a34cbae2fac2a", "level": "none", "message": {"text": "Commented-code block (6 lines) in js/articles-new.js:1"}, "properties": {"repobilityId": "c7426f3fd7e8decd", "scanner": "scanner-primary", "fingerprint": "d99a34cbae2fac2a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba4be6fbb363c91c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/articles-new.js:240"}, "properties": {"repobilityId": "7800a68c2f0fa2ee", "scanner": "scanner-primary", "fingerprint": "ba4be6fbb363c91c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7ab59559225738f8", "level": "none", "message": {"text": "Commented-code block (7 lines) in js/data.js:5"}, "properties": {"repobilityId": "d2cd0e84e0c4492b", "scanner": "scanner-primary", "fingerprint": "7ab59559225738f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-79b114aade03c4e7", "level": "note", "message": {"text": "Legacy-named symbol `newsletter__copy` in js/main.js:1805"}, "properties": {"repobilityId": "838c0254f9c64a20", "scanner": "scanner-primary", "fingerprint": "79b114aade03c4e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-774900abd357aa37", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/main.js:49"}, "properties": {"repobilityId": "decb4572f2501f60", "scanner": "scanner-primary", "fingerprint": "774900abd357aa37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-429f98d5bfd1e3a2", "level": "none", "message": {"text": "Commented-code block (9 lines) in js/layout.js:31"}, "properties": {"repobilityId": "9c842e36db6ae6ae", "scanner": "scanner-primary", "fingerprint": "429f98d5bfd1e3a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-547b7c9019f0413b", "level": "none", "message": {"text": "Commented-code block (8 lines) in js/book-reviews.js:1"}, "properties": {"repobilityId": "0a13e949d47fb111", "scanner": "scanner-primary", "fingerprint": "547b7c9019f0413b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-260a0ac268e3836c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/book-reviews.js:339"}, "properties": {"repobilityId": "ff1483442dabd927", "scanner": "scanner-primary", "fingerprint": "260a0ac268e3836c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e4b020c442e67706", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/overview.js:117"}, "properties": {"repobilityId": "d8590daf0139ae15", "scanner": "scanner-primary", "fingerprint": "e4b020c442e67706", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fe2a9d39ab2ba81", "level": "none", "message": {"text": "Commented-code block (9 lines) in js/dashboard/games.js:11"}, "properties": {"repobilityId": "22426060d59e810a", "scanner": "scanner-primary", "fingerprint": "3fe2a9d39ab2ba81", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b5ed424a2ce2635", "level": "none", "message": {"text": "Commented-code block (9 lines) in js/dashboard/activity.js:3"}, "properties": {"repobilityId": "e3a2dea537b84b9a", "scanner": "scanner-primary", "fingerprint": "3b5ed424a2ce2635", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b723310420390179", "level": "none", "message": {"text": "Commented-code block (12 lines) in js/dashboard/searchability.js:4"}, "properties": {"repobilityId": "8ba5503082bf309b", "scanner": "scanner-primary", "fingerprint": "b723310420390179", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90360f0e1671dfc0", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/submissions.js:3"}, "properties": {"repobilityId": "8930340b36bbb182", "scanner": "scanner-primary", "fingerprint": "90360f0e1671dfc0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9c2fe52dda5db5f", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/admin.js:947"}, "properties": {"repobilityId": "c029b83f8c3b7ab0", "scanner": "scanner-primary", "fingerprint": "f9c2fe52dda5db5f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-edc4f97799666c9b", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/marketing.js:725"}, "properties": {"repobilityId": "9e3c84dd23a4eafd", "scanner": "scanner-primary", "fingerprint": "edc4f97799666c9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-119293fa57f80026", "level": "none", "message": {"text": "Commented-code block (7 lines) in js/dashboard/writer.js:23"}, "properties": {"repobilityId": "2b14692a17ea5eb2", "scanner": "scanner-primary", "fingerprint": "119293fa57f80026", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff3c951d8e184eb1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/writer.js:1213"}, "properties": {"repobilityId": "9109b895c1696521", "scanner": "scanner-primary", "fingerprint": "ff3c951d8e184eb1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8e8f02586f0e3212", "level": "none", "message": {"text": "Commented-code block (8 lines) in js/dashboard/tasks-admin.js:6"}, "properties": {"repobilityId": "087622ad090aa4ba", "scanner": "scanner-primary", "fingerprint": "8e8f02586f0e3212", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c567406c8804659", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/auto-deadlines.js:6"}, "properties": {"repobilityId": "550d36b113dc7c8f", "scanner": "scanner-primary", "fingerprint": "1c567406c8804659", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c99aad8583046f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/book-reviews-admin.js:4"}, "properties": {"repobilityId": "e15e873b5561ebd6", "scanner": "scanner-primary", "fingerprint": "1c99aad8583046f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b790eba6c5302fac", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/task-engine.js:308"}, "properties": {"repobilityId": "23c248a20300d5e4", "scanner": "scanner-primary", "fingerprint": "b790eba6c5302fac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3768d4324cc32050", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/final-review.js:23"}, "properties": {"repobilityId": "fb3c7f0e0dbccbb1", "scanner": "scanner-primary", "fingerprint": "3768d4324cc32050", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c29d32f03886f0d0", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/admin-import.js:30"}, "properties": {"repobilityId": "eafeaef91c96d94a", "scanner": "scanner-primary", "fingerprint": "c29d32f03886f0d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-233db3951bea693d", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/dashboard/calendar-export.js:1"}, "properties": {"repobilityId": "608aea7d49aa94b3", "scanner": "scanner-primary", "fingerprint": "233db3951bea693d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64dcc7200278fe3f", "level": "none", "message": {"text": "Commented-code block (14 lines) in js/dashboard/planner.js:7"}, "properties": {"repobilityId": "c9b52fab498d6a07", "scanner": "scanner-primary", "fingerprint": "64dcc7200278fe3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51248744b531cbd2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/planner.js:1373"}, "properties": {"repobilityId": "8037dc519400a296", "scanner": "scanner-primary", "fingerprint": "51248744b531cbd2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38f6184e7b908c45", "level": "none", "message": {"text": "Commented-code block (11 lines) in js/dashboard/schedule-calendar.js:4"}, "properties": {"repobilityId": "36d188063b24cd49", "scanner": "scanner-primary", "fingerprint": "38f6184e7b908c45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35c46d2dbaf87044", "level": "none", "message": {"text": "Commented-code block (7 lines) in js/dashboard/app.js:1"}, "properties": {"repobilityId": "4be905a8566f5ceb", "scanner": "scanner-primary", "fingerprint": "35c46d2dbaf87044", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d048fa020e579df7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/app.js:872"}, "properties": {"repobilityId": "83d8a781085279f2", "scanner": "scanner-primary", "fingerprint": "d048fa020e579df7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f943542b36c9c1c", "level": "none", "message": {"text": "Commented-code block (9 lines) in js/dashboard/book-reviews-writer.js:4"}, "properties": {"repobilityId": "9d88ac88c2b38a1f", "scanner": "scanner-primary", "fingerprint": "5f943542b36c9c1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be9431e89df815a9", "level": "none", "message": {"text": "Commented-code block (7 lines) in js/dashboard/tasks.js:10"}, "properties": {"repobilityId": "ab19ef43b3141ec4", "scanner": "scanner-primary", "fingerprint": "be9431e89df815a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a4660f3661f2a00", "level": "none", "message": {"text": "Commented-code block (6 lines) in js/dashboard/newsletter.js:399"}, "properties": {"repobilityId": "8a901d3dcdb7598b", "scanner": "scanner-primary", "fingerprint": "3a4660f3661f2a00", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29daac4ae899a9ae", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 js/dashboard/newsletter.js:626"}, "properties": {"repobilityId": "333a130b1d9dbb94", "scanner": "scanner-primary", "fingerprint": "29daac4ae899a9ae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-112af8f7e9131f15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-to-primary-db.mjs:39"}, "properties": {"repobilityId": "1838c12a421b3e1e", "scanner": "scanner-primary", "fingerprint": "112af8f7e9131f15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a123610da424f518", "level": "note", "message": {"text": "Legacy-named symbol `index_backup` in scripts/extract-hero-frames.js:6"}, "properties": {"repobilityId": "31981fc8119f748d", "scanner": "scanner-primary", "fingerprint": "a123610da424f518", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3243ef041fd64e1d", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/extract-hero-frames.js:63"}, "properties": {"repobilityId": "c730390261510fae", "scanner": "scanner-primary", "fingerprint": "3243ef041fd64e1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-744cc44fb907e862", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/generate-lqip-manifest.js:2"}, "properties": {"repobilityId": "4dcd5dfdd64891fc", "scanner": "scanner-primary", "fingerprint": "744cc44fb907e862", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd45537c59cca13d", "level": "note", "message": {"text": "Legacy-named symbol `index_backup` in scripts/extend-monument-frames.py:24"}, "properties": {"repobilityId": "6b08b2bcd6115492", "scanner": "scanner-primary", "fingerprint": "fd45537c59cca13d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5767a8323b837fa3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/seed-user-names.mjs:40"}, "properties": {"repobilityId": "5202eb0c238e015c", "scanner": "scanner-primary", "fingerprint": "5767a8323b837fa3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e3be31eeea0fbde1", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/backfill-tags.js:42"}, "properties": {"repobilityId": "96b7211af8ecd761", "scanner": "scanner-primary", "fingerprint": "e3be31eeea0fbde1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f05083546ef577b9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-subscribers.mjs:257"}, "properties": {"repobilityId": "cd5004f68ee1f472", "scanner": "scanner-primary", "fingerprint": "f05083546ef577b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c765a3ff40750a14", "level": "none", "message": {"text": "Commented-code block (5 lines) in founders-sms-worker/worker.js:1"}, "properties": {"repobilityId": "c2842b24ec0fd00d", "scanner": "scanner-primary", "fingerprint": "c765a3ff40750a14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a675b5ea6b201272", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 founders-sms-worker/worker.js:38"}, "properties": {"repobilityId": "016589018e0846bd", "scanner": "scanner-primary", "fingerprint": "a675b5ea6b201272", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-22cca29518a264b9", "level": "none", "message": {"text": "Commented-code block (5 lines) in scheduler/modalFixes_APPLY.js:1"}, "properties": {"repobilityId": "b7dea7bf627135f5", "scanner": "scanner-primary", "fingerprint": "22cca29518a264b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4d7549195d4325e", "level": "none", "message": {"text": "Commented-code block (5 lines) in scheduler/calendarExport.js:1"}, "properties": {"repobilityId": "f1fcf5d8d3fcc895", "scanner": "scanner-primary", "fingerprint": "c4d7549195d4325e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e69511928c9f989e", "level": "none", "message": {"text": "Commented-code block (5 lines) in scheduler/dashboard.js:7047"}, "properties": {"repobilityId": "0322a2fe5bf7bd94", "scanner": "scanner-primary", "fingerprint": "e69511928c9f989e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99529794720072d7", "level": "none", "message": {"text": "Commented-code block (6 lines) in scheduler/autoDeadlines.js:7"}, "properties": {"repobilityId": "e4132137fdda9225", "scanner": "scanner-primary", "fingerprint": "99529794720072d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4ea08167a7483cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in scheduler/dashboardHelpers.js:160"}, "properties": {"repobilityId": "cac73aeff7bdff9b", "scanner": "scanner-primary", "fingerprint": "a4ea08167a7483cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98da3ad4461a6804", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scheduler/dashboardHelpers.js:23"}, "properties": {"repobilityId": "75728c554c94e52a", "scanner": "scanner-primary", "fingerprint": "98da3ad4461a6804", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a0bda467f237d78", "level": "none", "message": {"text": "Commented-code block (6 lines) in scheduler/titleEditFix.js:1"}, "properties": {"repobilityId": "32f57c8d6ebfd279", "scanner": "scanner-primary", "fingerprint": "7a0bda467f237d78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3671d68ecacad2da", "level": "error", "message": {"text": "Dangling fetch: POST https://challenges.cloudflare.com/turnstile/v0/siteverify (functions/api/book-reviews/submit.js:312)"}, "properties": {"repobilityId": "4716bd4a0d2d2e87", "scanner": "scanner-primary", "fingerprint": "3671d68ecacad2da", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7f0727ca9b9f47be", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (functions/_utils/firebase.js:174)"}, "properties": {"repobilityId": "e4b5ebe20e371199", "scanner": "scanner-primary", "fingerprint": "7f0727ca9b9f47be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a14760f447dfe1f2", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (functions/_utils/resend.js:55)"}, "properties": {"repobilityId": "1c94df62827b47a8", "scanner": "scanner-primary", "fingerprint": "a14760f447dfe1f2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5cde6dfc5f30fa62", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails/batch (functions/_utils/resend.js:91)"}, "properties": {"repobilityId": "349b23ca89896d49", "scanner": "scanner-primary", "fingerprint": "5cde6dfc5f30fa62", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b92a7408b6222cf1", "level": "error", "message": {"text": "Dangling fetch: POST https://firestore.googleapis.com/v1/projects/${FIRESTORE_PROJECT}/databases/(default)/documents:runQuery (functions/_utils/article-meta.js:309)"}, "properties": {"repobilityId": "a2a6e628b2e8259c", "scanner": "scanner-primary", "fingerprint": "b92a7408b6222cf1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5705b2b4a9c7eb01", "level": "error", "message": {"text": "Dangling fetch: POST https://firestore.googleapis.com/v1/projects/${FIRESTORE_PROJECT}/databases/(default)/documents:runQuery (functions/_utils/article-meta.js:366)"}, "properties": {"repobilityId": "eb2af3bb3197b8c7", "scanner": "scanner-primary", "fingerprint": "5705b2b4a9c7eb01", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d8883a7c658f155", "level": "error", "message": {"text": "Dangling fetch: POST https://api.indexnow.org/IndexNow (functions/_utils/seo-notify.js:31)"}, "properties": {"repobilityId": "6e7e85f9163cbdbe", "scanner": "scanner-primary", "fingerprint": "8d8883a7c658f155", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-60751bb7060ada89", "level": "error", "message": {"text": "Dangling fetch: POST https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache (functions/_utils/seo-notify.js:66)"}, "properties": {"repobilityId": "7c6cb77eb16fb664", "scanner": "scanner-primary", "fingerprint": "60751bb7060ada89", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-69d5f9bd48b96c65", "level": "error", "message": {"text": "Dangling fetch: POST /api/publish (js/admin-publish-bridge.js:18)"}, "properties": {"repobilityId": "6ff9206bfb5cff86", "scanner": "scanner-primary", "fingerprint": "69d5f9bd48b96c65", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4afc4c579daa1849", "level": "error", "message": {"text": "Dangling fetch: POST /api/subscribe (js/newsletter-handler.js:74)"}, "properties": {"repobilityId": "687d0f3f7e45dcb4", "scanner": "scanner-primary", "fingerprint": "4afc4c579daa1849", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7fa4117ad63ac2d9", "level": "error", "message": {"text": "Dangling fetch: POST /api/analytics/visit (js/main.js:457)"}, "properties": {"repobilityId": "b8e01ba4f2538fa6", "scanner": "scanner-primary", "fingerprint": "7fa4117ad63ac2d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e9a7814a1f2ee7ca", "level": "error", "message": {"text": "Dangling fetch: POST https://firestore.googleapis.com/v1/projects/${projectId}/databases/(default)/documents:runQuery (js/main.js:1467)"}, "properties": {"repobilityId": "ad7ed5f9cd1a12f7", "scanner": "scanner-primary", "fingerprint": "e9a7814a1f2ee7ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f7556123092bfde", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(clean)}&country=US&maxResults=1 (js/main.js:1566)"}, "properties": {"repobilityId": "74c995096ab6288a", "scanner": "scanner-primary", "fingerprint": "1f7556123092bfde", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-865d122f6871032d", "level": "error", "message": {"text": "Dangling fetch: GET /posts/games/_template.html (js/main.js:2906)"}, "properties": {"repobilityId": "9881aed36c6ae0f9", "scanner": "scanner-primary", "fingerprint": "865d122f6871032d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-459a12abb79eedd2", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(isbn)}&country=US&maxResults=1 (js/book-reviews.js:1537)"}, "properties": {"repobilityId": "e95965abf51be668", "scanner": "scanner-primary", "fingerprint": "459a12abb79eedd2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-13a3df13e1099413", "level": "error", "message": {"text": "Dangling fetch: POST /api/book-reviews/submit (js/book-reviews.js:2099)"}, "properties": {"repobilityId": "a85368411dd76e89", "scanner": "scanner-primary", "fingerprint": "13a3df13e1099413", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9d65571c7f1bf11", "level": "error", "message": {"text": "Dangling fetch: POST /api/book-reviews/decide (js/dashboard/book-reviews-admin.js:222)"}, "properties": {"repobilityId": "4cdc6e0d2b1dfedf", "scanner": "scanner-primary", "fingerprint": "b9d65571c7f1bf11", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b1f443351107c6a", "level": "error", "message": {"text": "Dangling fetch: GET /css/styles.css (js/dashboard/final-review.js:250)"}, "properties": {"repobilityId": "03d6f638c5acd625", "scanner": "scanner-primary", "fingerprint": "3b1f443351107c6a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7138698c7e27a176", "level": "error", "message": {"text": "Dangling fetch: GET /css/article-premium.css (js/dashboard/final-review.js:282)"}, "properties": {"repobilityId": "8ec153ca23b7e037", "scanner": "scanner-primary", "fingerprint": "7138698c7e27a176", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b8e7a3a801e0ac3c", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/books/v1/volumes?q=isbn:${encodeURIComponent(clean)}&country=US&maxResults=1 (js/dashboard/book-reviews-writer.js:727)"}, "properties": {"repobilityId": "b19ba881bb2e370a", "scanner": "scanner-primary", "fingerprint": "b8e7a3a801e0ac3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a9226c31c6d1b618", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (scripts/migrate-subscribers.mjs:257)"}, "properties": {"repobilityId": "b4a0ffc91ee81a90", "scanner": "scanner-primary", "fingerprint": "a9226c31c6d1b618", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cccd3a6ce26dc104", "level": "error", "message": {"text": "Dangling fetch: POST /api/notify/event (scheduler/dashboardHelpers.js:23)"}, "properties": {"repobilityId": "4bdd5b0208064bf1", "scanner": "scanner-primary", "fingerprint": "cccd3a6ce26dc104", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "98e09bb8fcd7909b", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-793ed0e0a15c7d4e", "level": "note", "message": {"text": "Unused endpoint: POST /api/publish-article"}, "properties": {"repobilityId": "9c1ef67ef8d1c613", "scanner": "scanner-primary", "fingerprint": "793ed0e0a15c7d4e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b6da0b193bd494", "level": "note", "message": {"text": "Unused endpoint: POST /generate-article.php"}, "properties": {"repobilityId": "800ceb009aed629b", "scanner": "scanner-primary", "fingerprint": "e1b6da0b193bd494", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c90d4f2fb518f6c", "level": "note", "message": {"text": "Unused endpoint: OPTIONS /generate-article.php"}, "properties": {"repobilityId": "38fb460d21f38f0d", "scanner": "scanner-primary", "fingerprint": "8c90d4f2fb518f6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a96a2fe1099e7e1", "level": "note", "message": {"text": "Unused endpoint: POST /api/delete-article"}, "properties": {"repobilityId": "dc3d2d6b889bdece", "scanner": "scanner-primary", "fingerprint": "7a96a2fe1099e7e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f16ff40bbd2f2f4", "level": "note", "message": {"text": "Unused endpoint: GET /api/image-proxy"}, "properties": {"repobilityId": "9cfd8f53003cd1a0", "scanner": "scanner-primary", "fingerprint": "7f16ff40bbd2f2f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}