{"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-e738ac13116ad777", "name": "Stray `console.log` in TS/JS \u2014 api/lead.js:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/lead.js:99"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f3f77b936827b2ba", "name": "Stray `console.log` in TS/JS \u2014 api/verify-payment.js:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/verify-payment.js:59"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b8a786d457bc8abb", "name": "Stray `console.log` in TS/JS \u2014 scripts/indexnow-ping.js:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/indexnow-ping.js:71"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c43c073c0112cc63", "name": "Insecure pattern 'direct_innerhtml_assignment' in ads-consent.js:94", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ads-consent.js:94"}, "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-d0c5c386db279c80", "name": "Insecure pattern 'direct_innerhtml_assignment' in teach.html:533", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teach.html:533"}, "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-0b171cf0ded24421", "name": "Insecure pattern 'direct_innerhtml_assignment' in razorpay-checkout.js:212", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in razorpay-checkout.js:212"}, "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-2c4393d324526645", "name": "Insecure pattern 'direct_innerhtml_assignment' in course-player.html:541", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in course-player.html:541"}, "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-cf9e1e4d8b38330a", "name": "Insecure pattern 'direct_innerhtml_assignment' in Course.html:303", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Course.html:303"}, "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-a988651ba4e3b1aa", "name": "Insecure pattern 'direct_innerhtml_assignment' in lead-capture.js:43", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in lead-capture.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-6ab986d0874d3047", "name": "Insecure pattern 'direct_innerhtml_assignment' in main.js:160", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in main.js:160"}, "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-2d0334cbb80ff16b", "name": "Insecure pattern 'direct_innerhtml_assignment' in creator.html:339", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in creator.html:339"}, "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-ee74b6d1c7124e38", "name": "Insecure pattern 'cors_wildcard' in api/lead.js:14", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in api/lead.js:14"}, "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-86f30f1126e13148", "name": "Insecure pattern 'cors_wildcard' in api/create-order.js:11", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in api/create-order.js:11"}, "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-45ff38e5a9a21fed", "name": "Insecure pattern 'cors_wildcard' in api/verify-payment.js:10", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in api/verify-payment.js:10"}, "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-3c797d67c731ad5e", "name": "Insecure pattern 'direct_innerhtml_assignment' in tools/linkedin-carousels.html:525", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/linkedin-carousels.html:525"}, "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-ca3c06de6560ff81", "name": "Insecure pattern 'direct_innerhtml_assignment' in offers/2-day-ai-workshop.html:1764", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in offers/2-day-ai-workshop.html:1764"}, "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-875b67de507ab95c", "name": "Insecure pattern 'direct_innerhtml_assignment' in offers/ai-trading-flash.html:317", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in offers/ai-trading-flash.html:317"}, "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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "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 8 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-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "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 8 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-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, operator-readme. 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-11524a177ffd163a", "name": "Legacy-named symbol `af_consent_v1` in ads-consent.js:24", "shortDescription": {"text": "Legacy-named symbol `af_consent_v1` in ads-consent.js: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-9ab93c5736b2b207", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lead-capture.js:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lead-capture.js:85"}, "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}}]}}, "automationDetails": {"id": "repobility/24012"}, "properties": {"repository": "AjitOv/aifreedom-landing", "repoUrl": "https://github.com/AjitOv/aifreedom-landing", "branch": "main"}, "results": [{"ruleId": "scanner-e738ac13116ad777", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/lead.js:99"}, "properties": {"repobilityId": "8028e96ff8458e8c", "scanner": "scanner-primary", "fingerprint": "e738ac13116ad777", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f3f77b936827b2ba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/verify-payment.js:59"}, "properties": {"repobilityId": "5b965d57f3eb4de3", "scanner": "scanner-primary", "fingerprint": "f3f77b936827b2ba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b8a786d457bc8abb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/indexnow-ping.js:71"}, "properties": {"repobilityId": "5fbf5fffc495f5ce", "scanner": "scanner-primary", "fingerprint": "b8a786d457bc8abb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c43c073c0112cc63", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ads-consent.js:94"}, "properties": {"repobilityId": "45821615dc9f72b2", "scanner": "scanner-primary", "fingerprint": "c43c073c0112cc63", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ads-consent.js"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-d0c5c386db279c80", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teach.html:533"}, "properties": {"repobilityId": "96e21bd86a781c60", "scanner": "scanner-primary", "fingerprint": "d0c5c386db279c80", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "teach.html"}, "region": {"startLine": 533}}}]}, {"ruleId": "scanner-0b171cf0ded24421", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in razorpay-checkout.js:212"}, "properties": {"repobilityId": "870c7dfba14975d3", "scanner": "scanner-primary", "fingerprint": "0b171cf0ded24421", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "razorpay-checkout.js"}, "region": {"startLine": 212}}}]}, {"ruleId": "scanner-2c4393d324526645", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in course-player.html:541"}, "properties": {"repobilityId": "500ac0c6f3bd7402", "scanner": "scanner-primary", "fingerprint": "2c4393d324526645", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "course-player.html"}, "region": {"startLine": 541}}}]}, {"ruleId": "scanner-cf9e1e4d8b38330a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in Course.html:303"}, "properties": {"repobilityId": "ed96d0afc3dbf98c", "scanner": "scanner-primary", "fingerprint": "cf9e1e4d8b38330a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Course.html"}, "region": {"startLine": 303}}}]}, {"ruleId": "scanner-a988651ba4e3b1aa", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in lead-capture.js:43"}, "properties": {"repobilityId": "eaee76703fd7eb40", "scanner": "scanner-primary", "fingerprint": "a988651ba4e3b1aa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lead-capture.js"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-6ab986d0874d3047", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in main.js:160"}, "properties": {"repobilityId": "1b4d35edc097833f", "scanner": "scanner-primary", "fingerprint": "6ab986d0874d3047", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "main.js"}, "region": {"startLine": 160}}}]}, {"ruleId": "scanner-2d0334cbb80ff16b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in creator.html:339"}, "properties": {"repobilityId": "707dd83186e2b2cc", "scanner": "scanner-primary", "fingerprint": "2d0334cbb80ff16b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "creator.html"}, "region": {"startLine": 339}}}]}, {"ruleId": "scanner-ee74b6d1c7124e38", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in api/lead.js:14"}, "properties": {"repobilityId": "cdf72866b438d5f2", "scanner": "scanner-primary", "fingerprint": "ee74b6d1c7124e38", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/lead.js"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-86f30f1126e13148", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in api/create-order.js:11"}, "properties": {"repobilityId": "b0ed4e7fed386e1b", "scanner": "scanner-primary", "fingerprint": "86f30f1126e13148", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/create-order.js"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-45ff38e5a9a21fed", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in api/verify-payment.js:10"}, "properties": {"repobilityId": "ac2a41d54231c360", "scanner": "scanner-primary", "fingerprint": "45ff38e5a9a21fed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/verify-payment.js"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-3c797d67c731ad5e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/linkedin-carousels.html:525"}, "properties": {"repobilityId": "492f5db5c0224615", "scanner": "scanner-primary", "fingerprint": "3c797d67c731ad5e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/linkedin-carousels.html"}, "region": {"startLine": 525}}}]}, {"ruleId": "scanner-ca3c06de6560ff81", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in offers/2-day-ai-workshop.html:1764"}, "properties": {"repobilityId": "58dd7c3928b3d4c8", "scanner": "scanner-primary", "fingerprint": "ca3c06de6560ff81", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "offers/2-day-ai-workshop.html"}, "region": {"startLine": 1764}}}]}, {"ruleId": "scanner-875b67de507ab95c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in offers/ai-trading-flash.html:317"}, "properties": {"repobilityId": "b40f17a1a9f34967", "scanner": "scanner-primary", "fingerprint": "875b67de507ab95c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "offers/ai-trading-flash.html"}, "region": {"startLine": 317}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"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": "51335a86b37fc943", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "0dc15b84847cf32a", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "5fe04c9dc07d6f1a", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "6e3aa15f61ef0c02", "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": "596a5da1b2e68ad7", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-11524a177ffd163a", "level": "note", "message": {"text": "Legacy-named symbol `af_consent_v1` in ads-consent.js:24"}, "properties": {"repobilityId": "ffd65925dc9ea30e", "scanner": "scanner-primary", "fingerprint": "11524a177ffd163a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9ab93c5736b2b207", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lead-capture.js:85"}, "properties": {"repobilityId": "52f267bfd9485011", "scanner": "scanner-primary", "fingerprint": "9ab93c5736b2b207", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}