{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f8bbd7ef51acc78", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-learn-rate-limit.js:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-learn-rate-limit.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-0b4bdbe5e4c82620", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-claude-pricing-drift.js:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-claude-pricing-drift.js:29"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b1950b91e8b8309", "name": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Header.js:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Header.js:98"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b0a233d8af77bbc3", "name": "Icon-only button without accessible name \u2014 components/ai/LiveChatTester.js:158", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/ai/LiveChatTester.js:158"}, "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-6f9e7c32afbf7d9d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/learn/TryItPanel.js:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/learn/TryItPanel.js:193"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c325f8ca59460791", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/EnhancedMeta.js:94", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/EnhancedMeta.js:94"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe28049e9b7388d8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/CalculatorComparison.js:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/CalculatorComparison.js:191"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a8ce10da8753f96", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/RichSnippets.js:143", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/RichSnippets.js:143"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a74944a221962eb6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/YouTubeVideoSection.js:47", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/YouTubeVideoSection.js:47"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d29037d808f2da6c", "name": "Stray `console.log` in TS/JS \u2014 components/ui/EnhancedSEO.js:293", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/ui/EnhancedSEO.js:293"}, "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-3e94e44a982618cb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/EnhancedSEO.js:73", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/EnhancedSEO.js:73"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac508e019c851e63", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/OptimizedImage.js:63", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/OptimizedImage.js:63"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12dd1b086594219c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/CalculatorSchema.js:108", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/CalculatorSchema.js:108"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-44b43beaa3d5ad6a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/OrganizationSchema.js:76", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/OrganizationSchema.js:76"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5c6c2b913ae397b3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/EnhancedFAQSchema.js:41", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/EnhancedFAQSchema.js:41"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc55d14d21c5d678", "name": "Stray `console.log` in TS/JS \u2014 components/sections/Newsletter.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/sections/Newsletter.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-4448b087df28cbab", "name": "TODO/FIXME marker in shipping code \u2014 components/tools/ROICalculator.js:62", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 components/tools/ROICalculator.js:62"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-497248c4029e318f", "name": "Stray `console.log` in TS/JS \u2014 components/tools/ROICalculator.js:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/tools/ROICalculator.js:63"}, "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-c50fde3638024398", "name": "`truncate` class without `title=` for hover reveal \u2014 components/tools/BusinessNameGenerator.js:545", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/tools/BusinessNameGenerator.js:545"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6283a2c64a394193", "name": "Stray `console.log` in TS/JS \u2014 components/tools/BusinessNameGenerator.js:90", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/tools/BusinessNameGenerator.js:90"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d554b6118db23ebe", "name": "Stray `console.log` in TS/JS \u2014 components/calculators/EcommerceAICalculator.js:142", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/calculators/EcommerceAICalculator.js:142"}, "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-2b0f9948640aabc1", "name": "TODO/FIXME marker in shipping code \u2014 components/calculators/CostComparisonCalculator.js:151", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 components/calculators/CostComparisonCalculator.js:151"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-77a809be875f5082", "name": "Stray `console.log` in TS/JS \u2014 components/calculators/CostComparisonCalculator.js:152", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/calculators/CostComparisonCalculator.js:152"}, "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-a7460bc9f4ed2a14", "name": "Stray `console.log` in TS/JS \u2014 components/calculators/ContentSpeedCalculator.js:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/calculators/ContentSpeedCalculator.js:97"}, "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-a58cf65e817a6b7c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-mcp-stack.js:195", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-mcp-stack.js:195"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4fe4f47186dbbca9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/education-ai.js:127", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/education-ai.js:127"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e25f4f4a974d339", "name": "TODO/FIXME marker in shipping code \u2014 pages/ecommerce-ai.js:13", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 pages/ecommerce-ai.js:13"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-956328dc738c38d8", "name": "Stray `console.log` in TS/JS \u2014 pages/ecommerce-ai.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/ecommerce-ai.js:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce5ecd79eda826b5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/vibe-coding.js:56", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/vibe-coding.js:56"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0821e339f082c22f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/best-ai-tools.js:658", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/best-ai-tools.js:658"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-26112183bb5e9b2a", "name": "Stray `console.log` in TS/JS \u2014 pages/ai-prompt-examples.js:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/ai-prompt-examples.js:145"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aeb63a606bfd548f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/chatgpt-prompt-templates.js:30", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/chatgpt-prompt-templates.js:30"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d1033ee636c6c13", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/replit-vs-lovable.js:161", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/replit-vs-lovable.js:161"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef20d35063973be5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/video-tutorials.js:127", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/video-tutorials.js:127"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-160f4c4ec649abe8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/real-estate-ai.js:127", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/real-estate-ai.js:127"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b1026324a4558cf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-pro-vs-max-vs-api.js:127", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-pro-vs-max-vs-api.js:127"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ebe8af597cf06bc", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-vs-cursor.js:144", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-vs-cursor.js:144"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ad92213989b0ae9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-md-playbook.js:255", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-md-playbook.js:255"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6eea2915a1c41c3e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/legal-ai.js:127", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/legal-ai.js:127"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ca343088f79c4995", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/custom-ai-agents.js:298", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/custom-ai-agents.js:298"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-04f6828f8935eaf9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/skills-vs-mcp-vs-hooks.js:132", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/skills-vs-mcp-vs-hooks.js:132"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6cf0285888f417da", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-guide.js:140", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-guide.js:140"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-305d5daddf0c7b0f", "name": "TODO/FIXME marker in shipping code \u2014 pages/service-business-ai.js:13", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 pages/service-business-ai.js:13"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76d4c38cb5fbd071", "name": "Stray `console.log` in TS/JS \u2014 pages/service-business-ai.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/service-business-ai.js:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc1bda899c4d3af8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-hooks-recipes.js:249", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-hooks-recipes.js:249"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-64756b622e19e10f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/_document.js:16", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/_document.js:16"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a0453352876c522b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/vision-ai-prompts.js:137", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/vision-ai-prompts.js:137"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c81dce51cb894e3f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/api-pricing.js:91", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/api-pricing.js:91"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-20f4f35546673ffb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/index.js:75", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/index.js:75"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63fe2510c3f9dec9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-vs-chatgpt.js:164", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-vs-chatgpt.js:164"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e3d6ae8d92274c39", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-models.js:185", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-models.js:185"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e8fed6308fd43c6e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/healthcare-ai.js:127", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/healthcare-ai.js:127"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-007e7dd43da40d86", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompt-examples/index.js:37", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompt-examples/index.js:37"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-166874e036cad921", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompt-examples/[slug].js:37", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompt-examples/[slug].js:37"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-724347d3cc141869", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/install-guide.js:103", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/install-guide.js:103"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c562c7f856726218", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/index.js:130", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/index.js:130"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a4c93489640ab25e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/[slug].js:60", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/[slug].js:60"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c7acf87658cbdd2d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/build-your-own.js:69", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/build-your-own.js:69"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3533ebc5cbb3ff6b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/category/[category].js:44", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/category/[category].js:44"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e9833c8021802215", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/learn/index.js:38", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/learn/index.js:38"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a2ca310b027175f0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/learn/[module].js:62", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/learn/[module].js:62"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1259805612d18a09", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/observatory/index.js:46", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/observatory/index.js:46"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c71836fad6276bb9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/observatory/[date].js:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/observatory/[date].js:52"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8286cdca3d164c3c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/observatory/prompts/[id].js:65", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/observatory/prompts/[id].js:65"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ebb165fefdcfe69", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-models/[slug].js:78", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-models/[slug].js:78"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f01660357ccad6d5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/tools/mad-libs-prompt-creator.js:396", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/tools/mad-libs-prompt-creator.js:396"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b8dc73a70c12968", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/tools/prompt-diagnostic-quiz.js:233", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/tools/prompt-diagnostic-quiz.js:233"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3850ddbccc13621f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/chatgpt-prompts-for/[modifier].js:74", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/chatgpt-prompts-for/[modifier].js:74"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b9036ac89879f8e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/hr-managers.js:62", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/hr-managers.js:62"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72cec92f222f4ebd", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/sales-teams.js:62", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/sales-teams.js:62"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-af4238175ad0ea32", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/marketing-professionals.js:131", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/marketing-professionals.js:131"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-685dc7008ce2c89a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/content-creators.js:62", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/content-creators.js:62"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-739ee390f31ea891", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/small-business-owners.js:62", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/small-business-owners.js:62"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d372c7353282d012", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/model-prompting-guide/index.js:27", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/model-prompting-guide/index.js:27"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9cb158bb52dfd200", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/model-prompting-guide/[model].js:39", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/model-prompting-guide/[model].js:39"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3e96d4b5da6b6e3f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-prompt-cost.js:76", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-prompt-cost.js:76"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1859a2c9f173232e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/customer-service-ai-savings.js:87", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/customer-service-ai-savings.js:87"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-526a1832eaa7fd5a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-model-selector.js:102", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-model-selector.js:102"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc5c25a362225bac", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-code-vs-cursor-cost.js:114", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-code-vs-cursor-cost.js:114"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4b225e89161d2b3d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-plan-picker.js:148", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-plan-picker.js:148"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0ba8be2649066e0c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/ecommerce-ai-savings.js:120", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/ecommerce-ai-savings.js:120"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1cf3a3e465b85835", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/business-ai-readiness.js:87", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/business-ai-readiness.js:87"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-805ce34c2fae3987", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/index.js:142", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/index.js:142"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b02debe77a3473f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/content-creation-speed.js:108", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/content-creation-speed.js:108"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-865271a63a0fc6df", "name": "`truncate` class without `title=` for hover reveal \u2014 pages/ai-prompt-generator/enhanced.js:246", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 pages/ai-prompt-generator/enhanced.js:246"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-252015697d080ab2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-prompt-generator/index.js:237", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-prompt-generator/index.js:237"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ec016e3fd6389b12", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-prompt-generator/[slug].js:50", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-prompt-generator/[slug].js:50"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1f98b1a55919bd76", "name": "Stray `console.log` in TS/JS \u2014 netlify/functions/submission-created.js:125", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/submission-created.js:125"}, "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-d335532c410b76b1", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/EnhancedMeta.js:94", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/EnhancedMeta.js:94"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-26132d877eb60fde", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/RichSnippets.js:143", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/RichSnippets.js:143"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2e66ce5cd7220add", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/YouTubeVideoSection.js:47", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/YouTubeVideoSection.js:47"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0eddb3d177529155", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/EnhancedSEO.js:73", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/EnhancedSEO.js:73"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-276d53421234e0ff", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/OptimizedImage.js:63", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/OptimizedImage.js:63"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-efa8958375a8e52e", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/CalculatorSchema.js:108", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/CalculatorSchema.js:108"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d7acab3f8f271417", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/OrganizationSchema.js:76", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/OrganizationSchema.js:76"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9899dd478a4ec9c2", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/EnhancedFAQSchema.js:41", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/EnhancedFAQSchema.js:41"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-94c747d4779471de", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-mcp-stack.js:195", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-mcp-stack.js:195"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8709f10a65490041", "name": "Insecure pattern 'dangerous_innerhtml' in pages/education-ai.js:127", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/education-ai.js:127"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e18373ac001fa542", "name": "Insecure pattern 'dangerous_innerhtml' in pages/vibe-coding.js:56", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/vibe-coding.js:56"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-489f69bf1944a59b", "name": "Insecure pattern 'dangerous_innerhtml' in pages/best-ai-tools.js:658", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/best-ai-tools.js:658"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-30de22e9522b4305", "name": "Insecure pattern 'dangerous_innerhtml' in pages/replit-vs-lovable.js:161", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/replit-vs-lovable.js:161"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac8ec929e9f1c60a", "name": "Insecure pattern 'dangerous_innerhtml' in pages/video-tutorials.js:127", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/video-tutorials.js:127"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a2fd4f82d4af78df", "name": "Insecure pattern 'dangerous_innerhtml' in pages/real-estate-ai.js:127", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/real-estate-ai.js:127"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-20326456ecf5fd0d", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-pro-vs-max-vs-api.js:127", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-pro-vs-max-vs-api.js:127"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-91bc3afba1e47021", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-vs-cursor.js:144", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-vs-cursor.js:144"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c998281a9d744bd2", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-md-playbook.js:255", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-md-playbook.js:255"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-86ec3e68795c13fd", "name": "Insecure pattern 'dangerous_innerhtml' in pages/legal-ai.js:127", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/legal-ai.js:127"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3fdceeca3cc3ef65", "name": "Insecure pattern 'dangerous_innerhtml' in pages/custom-ai-agents.js:298", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/custom-ai-agents.js:298"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9f0e8b9690bed8ba", "name": "Insecure pattern 'dangerous_innerhtml' in pages/skills-vs-mcp-vs-hooks.js:132", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/skills-vs-mcp-vs-hooks.js:132"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-073fd798c30729d0", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-guide.js:140", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-guide.js:140"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c7adb5885ef2dda3", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-hooks-recipes.js:249", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-hooks-recipes.js:249"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2edacf595d44c033", "name": "Insecure pattern 'dangerous_innerhtml' in pages/_document.js:16", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/_document.js:16"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2aede62a3e1bc926", "name": "Insecure pattern 'dangerous_innerhtml' in pages/vision-ai-prompts.js:137", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/vision-ai-prompts.js:137"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71642e0cc2b5515c", "name": "Insecure pattern 'dangerous_innerhtml' in pages/api-pricing.js:91", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/api-pricing.js:91"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-716808da88417c1c", "name": "Insecure pattern 'dangerous_innerhtml' in pages/index.js:75", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/index.js:75"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c2386e7616e39ece", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-vs-chatgpt.js:164", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-vs-chatgpt.js:164"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72bd30613e2dd725", "name": "Insecure pattern 'dangerous_innerhtml' in pages/ai-models.js:185", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/ai-models.js:185"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28742c633f9f7a15", "name": "Insecure pattern 'dangerous_innerhtml' in pages/healthcare-ai.js:127", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/healthcare-ai.js:127"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-851dc76d3bf43e33", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/install-guide.js:103", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/install-guide.js:103"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-73ab6fff9a18b270", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/index.js:130", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/index.js:130"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2570439c02c6a9d4", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/[slug].js:60", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/[slug].js:60"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-77f46918b99611ed", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/build-your-own.js:69", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/build-your-own.js:69"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-309383ebda2c2193", "name": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/category/[category].js:44", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/category/[category].js:44"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c96c0493314bb77c", "name": "Insecure pattern 'dangerous_innerhtml' in pages/learn/index.js:38", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/learn/index.js:38"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ce2764b2ad06422", "name": "Insecure pattern 'dangerous_innerhtml' in pages/learn/[module].js:62", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/learn/[module].js:62"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-99a9a728c10762e9", "name": "Insecure pattern 'dangerous_innerhtml' in pages/observatory/index.js:46", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/observatory/index.js:46"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bd28955a88a33dbb", "name": "Insecure pattern 'dangerous_innerhtml' in pages/observatory/[date].js:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/observatory/[date].js:52"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5072daf7c2d1677e", "name": "Insecure pattern 'dangerous_innerhtml' in pages/observatory/prompts/[id].js:65", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/observatory/prompts/[id].js:65"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98f61f6a005acd04", "name": "Insecure pattern 'dangerous_innerhtml' in pages/ai-models/[slug].js:78", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/ai-models/[slug].js:78"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc053dbaa70cb9e1", "name": "Insecure pattern 'dangerous_innerhtml' in pages/tools/mad-libs-prompt-creator.js:396", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/tools/mad-libs-prompt-creator.js:396"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-52ae39d133b96ef5", "name": "Insecure pattern 'dangerous_innerhtml' in pages/tools/prompt-diagnostic-quiz.js:233", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/tools/prompt-diagnostic-quiz.js:233"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-15279b1b344f8568", "name": "Insecure pattern 'dangerous_innerhtml' in pages/chatgpt-prompts-for/[modifier].js:74", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/chatgpt-prompts-for/[modifier].js:74"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dfc661bf9806afbb", "name": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/hr-managers.js:62", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/hr-managers.js:62"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ab51f31fae0e549c", "name": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/sales-teams.js:62", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/sales-teams.js:62"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2151f52a68fb0899", "name": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/marketing-professionals.js:131", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/marketing-professionals.js:131"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1f3f11b74b609dd8", "name": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/content-creators.js:62", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/content-creators.js:62"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9e73cf65e54208a3", "name": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/small-business-owners.js:62", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/small-business-owners.js:62"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-754cefeb42a43f73", "name": "Insecure pattern 'dangerous_innerhtml' in pages/model-prompting-guide/index.js:27", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/model-prompting-guide/index.js:27"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5e2febda42e1e64d", "name": "Insecure pattern 'dangerous_innerhtml' in pages/model-prompting-guide/[model].js:39", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/model-prompting-guide/[model].js:39"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-868c840b63399d45", "name": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-prompt-cost.js:76", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-prompt-cost.js:76"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-50d4b6bb3676256d", "name": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/customer-service-ai-savings.js:87", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/customer-service-ai-savings.js:87"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28ec3837562bd37a", "name": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-model-selector.js:102", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-model-selector.js:102"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dce74ae793ae59f1", "name": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-code-vs-cursor-cost.js:114", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-code-vs-cursor-cost.js:114"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72fd53e49e1ef461", "name": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-plan-picker.js:148", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-plan-picker.js:148"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db44149d6fa5e9fd", "name": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/ecommerce-ai-savings.js:120", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/ecommerce-ai-savings.js:120"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1164366d9596a2dc", "name": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/business-ai-readiness.js:87", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/business-ai-readiness.js:87"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e45b13800fad5e7e", "name": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/index.js:142", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/index.js:142"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3010c8cf2b2e8840", "name": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/content-creation-speed.js:108", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/content-creation-speed.js:108"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a10971db0e57833", "name": "Insecure pattern 'dangerous_innerhtml' in pages/ai-prompt-generator/index.js:237", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/ai-prompt-generator/index.js:237"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf5077dfedac37df", "name": "Insecure pattern 'dangerous_innerhtml' in pages/ai-prompt-generator/[slug].js:50", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/ai-prompt-generator/[slug].js:50"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd5759e7b1e7d200", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/github-script@v7 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7cf6ab11df29562a", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55687259afc85cd5", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2f5de680cec26b7e", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/github-script@v7 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6bac8d11dd66b0e1", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de53ac274e5b4ecf", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37716d9c0a33ad5c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98aa187431404c05", "name": "Very large file: pages/custom-ai-agents.js (1215 lines)", "shortDescription": {"text": "Very large file: pages/custom-ai-agents.js (1215 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-1774f7d998fe72dd", "name": "Very large file: pages/ai-glossary.js (1026 lines)", "shortDescription": {"text": "Very large file: pages/ai-glossary.js (1026 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-d0b3f0357d839287", "name": "Very large file: pages/claude-code-guide.js (884 lines)", "shortDescription": {"text": "Very large file: pages/claude-code-guide.js (884 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-84e8b09381fdcab9", "name": "Very large file: pages/ai-prompt-generator/index.js (1305 lines)", "shortDescription": {"text": "Very large file: pages/ai-prompt-generator/index.js (1305 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "24 tests / 213 src (ratio 0.11)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 81 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 188 placeholder/mock markers across 32 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b61cf3bbbef67b3", "name": "Agent authority lacks a verifier contract: .claude/agents/code-reviewer.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/code-reviewer.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-470336fdd7a17b7c", "name": "Agent authority lacks a verifier contract: .claude/agents/seo-specialist.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/seo-specialist.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d55d8d9d675eb5bc", "name": "Agent authority lacks a verifier contract: .claude/agents/security-reviewer.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/security-reviewer.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-77dcec51528a4ebd", "name": "Commented-code block (5 lines) in scripts/check-claude-pricing-drift.js:7", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/check-claude-pricing-drift.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-5b662c1df30131cb", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/observatory/open_pr.py:98", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/observatory/open_pr.py:98"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63086101fa06aade", "name": "Commented-code block (5 lines) in scripts/observatory/tests/test_integration_pipeline.py:59", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/observatory/tests/test_integration_pipeline.py:59"}, "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-8eb3d1ec733c431d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai/LiveChatTester.js:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai/LiveChatTester.js:58"}, "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-18d92fbe090e8f92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai/PromptOptimizer.js:209", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai/PromptOptimizer.js:209"}, "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-5bde53494ac34cbf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/tools/BusinessNameGenerator.js:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/tools/BusinessNameGenerator.js:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bf686904a490eeb2", "name": "Commented-code block (5 lines) in lib/critique/judge.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in lib/critique/judge.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-9ecbc1ab4f235326", "name": "Commented-code block (6 lines) in lib/templates/index.js:4", "shortDescription": {"text": "Commented-code block (6 lines) in lib/templates/index.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-59ccc7977587755a", "name": "Commented-code block (5 lines) in lib/studio/entitlements.js:6", "shortDescription": {"text": "Commented-code block (5 lines) in lib/studio/entitlements.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-9e8aa178334a12a2", "name": "Commented-code block (5 lines) in lib/gateway/openrouter.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/gateway/openrouter.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-8796690b11882b41", "name": "Commented-code block (9 lines) in lib/gateway/index.js:10", "shortDescription": {"text": "Commented-code block (9 lines) in lib/gateway/index.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-edf2c1ebe977fe16", "name": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/ai/chat.js:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/ai/chat.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-11717c7d9505a67d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/ai/optimize.js:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/ai/optimize.js:126"}, "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-d6ae507dfba2e088", "name": "Commented-code block (5 lines) in pages/api/studio/templates.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in pages/api/studio/templates.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-87a6e218580a53ac", "name": "Commented-code block (5 lines) in pages/api/studio/run.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in pages/api/studio/run.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-83ff8ab71acff9ba", "name": "Commented-code block (5 lines) in netlify/functions/submission-created.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in netlify/functions/submission-created.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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/observatory/write_runs.py:main, scripts/observatory/score_with_judge.py:main, scripts/observatory/run_models.py:main\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21055"}, "properties": {"repository": "The-Flash-Report/promptwritingstudio", "repoUrl": "https://github.com/The-Flash-Report/promptwritingstudio", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-2f8bbd7ef51acc78", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-learn-rate-limit.js:30"}, "properties": {"repobilityId": "ca6de803c9a1c1ff", "scanner": "scanner-primary", "fingerprint": "2f8bbd7ef51acc78", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b4bdbe5e4c82620", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-claude-pricing-drift.js:29"}, "properties": {"repobilityId": "f05ea7f11c002640", "scanner": "scanner-primary", "fingerprint": "0b4bdbe5e4c82620", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2b1950b91e8b8309", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/layout/Header.js:98"}, "properties": {"repobilityId": "53d68c814a062de8", "scanner": "scanner-primary", "fingerprint": "2b1950b91e8b8309", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0a233d8af77bbc3", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/ai/LiveChatTester.js:158"}, "properties": {"repobilityId": "83a2c95b5416c369", "scanner": "scanner-primary", "fingerprint": "b0a233d8af77bbc3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-6f9e7c32afbf7d9d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/learn/TryItPanel.js:193"}, "properties": {"repobilityId": "d58d66b27f3e2aa4", "scanner": "scanner-primary", "fingerprint": "6f9e7c32afbf7d9d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c325f8ca59460791", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/EnhancedMeta.js:94"}, "properties": {"repobilityId": "a7fa81367ddd38fb", "scanner": "scanner-primary", "fingerprint": "c325f8ca59460791", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fe28049e9b7388d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/CalculatorComparison.js:191"}, "properties": {"repobilityId": "fef1e16016930481", "scanner": "scanner-primary", "fingerprint": "fe28049e9b7388d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a8ce10da8753f96", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/RichSnippets.js:143"}, "properties": {"repobilityId": "7d288a8de93bd96f", "scanner": "scanner-primary", "fingerprint": "2a8ce10da8753f96", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a74944a221962eb6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/YouTubeVideoSection.js:47"}, "properties": {"repobilityId": "f8be53a5dff594d8", "scanner": "scanner-primary", "fingerprint": "a74944a221962eb6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d29037d808f2da6c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/ui/EnhancedSEO.js:293"}, "properties": {"repobilityId": "2a5aeb756b60a289", "scanner": "scanner-primary", "fingerprint": "d29037d808f2da6c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e94e44a982618cb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/EnhancedSEO.js:73"}, "properties": {"repobilityId": "eac660ec0ba20b9d", "scanner": "scanner-primary", "fingerprint": "3e94e44a982618cb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ac508e019c851e63", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/OptimizedImage.js:63"}, "properties": {"repobilityId": "cbe5a40f7725fc3e", "scanner": "scanner-primary", "fingerprint": "ac508e019c851e63", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-12dd1b086594219c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/CalculatorSchema.js:108"}, "properties": {"repobilityId": "a12a848783f77caf", "scanner": "scanner-primary", "fingerprint": "12dd1b086594219c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-44b43beaa3d5ad6a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/OrganizationSchema.js:76"}, "properties": {"repobilityId": "b732a1c638a63076", "scanner": "scanner-primary", "fingerprint": "44b43beaa3d5ad6a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5c6c2b913ae397b3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/EnhancedFAQSchema.js:41"}, "properties": {"repobilityId": "1fb9071cafe0e7ec", "scanner": "scanner-primary", "fingerprint": "5c6c2b913ae397b3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-dc55d14d21c5d678", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/sections/Newsletter.js:10"}, "properties": {"repobilityId": "6694a22c8078b18e", "scanner": "scanner-primary", "fingerprint": "dc55d14d21c5d678", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4448b087df28cbab", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 components/tools/ROICalculator.js:62"}, "properties": {"repobilityId": "d9b71589de8fc8ca", "scanner": "scanner-primary", "fingerprint": "4448b087df28cbab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-497248c4029e318f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/tools/ROICalculator.js:63"}, "properties": {"repobilityId": "c0f2a2e7514d322c", "scanner": "scanner-primary", "fingerprint": "497248c4029e318f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c50fde3638024398", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/tools/BusinessNameGenerator.js:545"}, "properties": {"repobilityId": "0ad01d7aa7d1d667", "scanner": "scanner-primary", "fingerprint": "c50fde3638024398", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6283a2c64a394193", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/tools/BusinessNameGenerator.js:90"}, "properties": {"repobilityId": "4575ffa52b2dacae", "scanner": "scanner-primary", "fingerprint": "6283a2c64a394193", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d554b6118db23ebe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/calculators/EcommerceAICalculator.js:142"}, "properties": {"repobilityId": "8bb67ba823efa0b5", "scanner": "scanner-primary", "fingerprint": "d554b6118db23ebe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2b0f9948640aabc1", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 components/calculators/CostComparisonCalculator.js:151"}, "properties": {"repobilityId": "7cedc1f868cb9d5d", "scanner": "scanner-primary", "fingerprint": "2b0f9948640aabc1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-77a809be875f5082", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/calculators/CostComparisonCalculator.js:152"}, "properties": {"repobilityId": "d81e12414e8b3276", "scanner": "scanner-primary", "fingerprint": "77a809be875f5082", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a7460bc9f4ed2a14", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/calculators/ContentSpeedCalculator.js:97"}, "properties": {"repobilityId": "8997583d8905f6c9", "scanner": "scanner-primary", "fingerprint": "a7460bc9f4ed2a14", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a58cf65e817a6b7c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-mcp-stack.js:195"}, "properties": {"repobilityId": "1782d4251c3f2aa6", "scanner": "scanner-primary", "fingerprint": "a58cf65e817a6b7c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4fe4f47186dbbca9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/education-ai.js:127"}, "properties": {"repobilityId": "ff2bf04ad2f7b66d", "scanner": "scanner-primary", "fingerprint": "4fe4f47186dbbca9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1e25f4f4a974d339", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 pages/ecommerce-ai.js:13"}, "properties": {"repobilityId": "56ce9e79730b3d02", "scanner": "scanner-primary", "fingerprint": "1e25f4f4a974d339", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-956328dc738c38d8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/ecommerce-ai.js:14"}, "properties": {"repobilityId": "95867cba6fb5771f", "scanner": "scanner-primary", "fingerprint": "956328dc738c38d8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce5ecd79eda826b5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/vibe-coding.js:56"}, "properties": {"repobilityId": "c6c2d1b9392a18fc", "scanner": "scanner-primary", "fingerprint": "ce5ecd79eda826b5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0821e339f082c22f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/best-ai-tools.js:658"}, "properties": {"repobilityId": "16e3eb700b9e3676", "scanner": "scanner-primary", "fingerprint": "0821e339f082c22f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-26112183bb5e9b2a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/ai-prompt-examples.js:145"}, "properties": {"repobilityId": "512154b1fcbb9646", "scanner": "scanner-primary", "fingerprint": "26112183bb5e9b2a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aeb63a606bfd548f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/chatgpt-prompt-templates.js:30"}, "properties": {"repobilityId": "0c72953605b32637", "scanner": "scanner-primary", "fingerprint": "aeb63a606bfd548f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9d1033ee636c6c13", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/replit-vs-lovable.js:161"}, "properties": {"repobilityId": "815a47a0b3eb79ef", "scanner": "scanner-primary", "fingerprint": "9d1033ee636c6c13", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ef20d35063973be5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/video-tutorials.js:127"}, "properties": {"repobilityId": "90cf369a226f44e4", "scanner": "scanner-primary", "fingerprint": "ef20d35063973be5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-160f4c4ec649abe8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/real-estate-ai.js:127"}, "properties": {"repobilityId": "0be0c90a44978943", "scanner": "scanner-primary", "fingerprint": "160f4c4ec649abe8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1b1026324a4558cf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-pro-vs-max-vs-api.js:127"}, "properties": {"repobilityId": "54426b127bdb9af2", "scanner": "scanner-primary", "fingerprint": "1b1026324a4558cf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4ebe8af597cf06bc", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-vs-cursor.js:144"}, "properties": {"repobilityId": "48ec448b42509bd5", "scanner": "scanner-primary", "fingerprint": "4ebe8af597cf06bc", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4ad92213989b0ae9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-md-playbook.js:255"}, "properties": {"repobilityId": "2272191f017bcb67", "scanner": "scanner-primary", "fingerprint": "4ad92213989b0ae9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6eea2915a1c41c3e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/legal-ai.js:127"}, "properties": {"repobilityId": "c4dfe150f9fa3587", "scanner": "scanner-primary", "fingerprint": "6eea2915a1c41c3e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ca343088f79c4995", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/custom-ai-agents.js:298"}, "properties": {"repobilityId": "26873571779724fa", "scanner": "scanner-primary", "fingerprint": "ca343088f79c4995", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-04f6828f8935eaf9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/skills-vs-mcp-vs-hooks.js:132"}, "properties": {"repobilityId": "b1822c2ac6286232", "scanner": "scanner-primary", "fingerprint": "04f6828f8935eaf9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6cf0285888f417da", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-guide.js:140"}, "properties": {"repobilityId": "56717388a3a7820e", "scanner": "scanner-primary", "fingerprint": "6cf0285888f417da", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-305d5daddf0c7b0f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 pages/service-business-ai.js:13"}, "properties": {"repobilityId": "60ad3f43965f4ba9", "scanner": "scanner-primary", "fingerprint": "305d5daddf0c7b0f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-76d4c38cb5fbd071", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/service-business-ai.js:14"}, "properties": {"repobilityId": "f303700e68924c8e", "scanner": "scanner-primary", "fingerprint": "76d4c38cb5fbd071", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc1bda899c4d3af8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-hooks-recipes.js:249"}, "properties": {"repobilityId": "a68c53c0253869e1", "scanner": "scanner-primary", "fingerprint": "bc1bda899c4d3af8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-64756b622e19e10f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/_document.js:16"}, "properties": {"repobilityId": "a10eee4a48fd2f54", "scanner": "scanner-primary", "fingerprint": "64756b622e19e10f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a0453352876c522b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/vision-ai-prompts.js:137"}, "properties": {"repobilityId": "92f547de4de31431", "scanner": "scanner-primary", "fingerprint": "a0453352876c522b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c81dce51cb894e3f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/api-pricing.js:91"}, "properties": {"repobilityId": "60a28e1540580a19", "scanner": "scanner-primary", "fingerprint": "c81dce51cb894e3f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-20f4f35546673ffb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/index.js:75"}, "properties": {"repobilityId": "788ddb01ae3eb314", "scanner": "scanner-primary", "fingerprint": "20f4f35546673ffb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-63fe2510c3f9dec9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-vs-chatgpt.js:164"}, "properties": {"repobilityId": "dea75c40b2428672", "scanner": "scanner-primary", "fingerprint": "63fe2510c3f9dec9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e3d6ae8d92274c39", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-models.js:185"}, "properties": {"repobilityId": "06742898917cf965", "scanner": "scanner-primary", "fingerprint": "e3d6ae8d92274c39", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e8fed6308fd43c6e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/healthcare-ai.js:127"}, "properties": {"repobilityId": "7fd44999b906bf35", "scanner": "scanner-primary", "fingerprint": "e8fed6308fd43c6e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-007e7dd43da40d86", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompt-examples/index.js:37"}, "properties": {"repobilityId": "e4b29ef35eb5e6f2", "scanner": "scanner-primary", "fingerprint": "007e7dd43da40d86", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-166874e036cad921", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompt-examples/[slug].js:37"}, "properties": {"repobilityId": "dbb04d61f0beca08", "scanner": "scanner-primary", "fingerprint": "166874e036cad921", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-724347d3cc141869", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/install-guide.js:103"}, "properties": {"repobilityId": "25b5d5fcc1c8e1e7", "scanner": "scanner-primary", "fingerprint": "724347d3cc141869", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c562c7f856726218", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/index.js:130"}, "properties": {"repobilityId": "c332aff8334c1988", "scanner": "scanner-primary", "fingerprint": "c562c7f856726218", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a4c93489640ab25e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/[slug].js:60"}, "properties": {"repobilityId": "f76f8491103f20bc", "scanner": "scanner-primary", "fingerprint": "a4c93489640ab25e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c7acf87658cbdd2d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/build-your-own.js:69"}, "properties": {"repobilityId": "45ba8f570f661039", "scanner": "scanner-primary", "fingerprint": "c7acf87658cbdd2d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3533ebc5cbb3ff6b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/claude-code-skills/category/[category].js:44"}, "properties": {"repobilityId": "df48f1d9be286bd2", "scanner": "scanner-primary", "fingerprint": "3533ebc5cbb3ff6b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e9833c8021802215", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/learn/index.js:38"}, "properties": {"repobilityId": "4d534da781f04e02", "scanner": "scanner-primary", "fingerprint": "e9833c8021802215", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a2ca310b027175f0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/learn/[module].js:62"}, "properties": {"repobilityId": "e50ae52663eab0c3", "scanner": "scanner-primary", "fingerprint": "a2ca310b027175f0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1259805612d18a09", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/observatory/index.js:46"}, "properties": {"repobilityId": "cd119372db603bdb", "scanner": "scanner-primary", "fingerprint": "1259805612d18a09", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c71836fad6276bb9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/observatory/[date].js:52"}, "properties": {"repobilityId": "1678d4f77825246b", "scanner": "scanner-primary", "fingerprint": "c71836fad6276bb9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8286cdca3d164c3c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/observatory/prompts/[id].js:65"}, "properties": {"repobilityId": "74de772913904da1", "scanner": "scanner-primary", "fingerprint": "8286cdca3d164c3c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4ebb165fefdcfe69", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-models/[slug].js:78"}, "properties": {"repobilityId": "3e19b349888287cf", "scanner": "scanner-primary", "fingerprint": "4ebb165fefdcfe69", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f01660357ccad6d5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/tools/mad-libs-prompt-creator.js:396"}, "properties": {"repobilityId": "222494dd9e861d78", "scanner": "scanner-primary", "fingerprint": "f01660357ccad6d5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8b8dc73a70c12968", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/tools/prompt-diagnostic-quiz.js:233"}, "properties": {"repobilityId": "438b2758938978dc", "scanner": "scanner-primary", "fingerprint": "8b8dc73a70c12968", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3850ddbccc13621f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/chatgpt-prompts-for/[modifier].js:74"}, "properties": {"repobilityId": "3a7127b3b82b2116", "scanner": "scanner-primary", "fingerprint": "3850ddbccc13621f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1b9036ac89879f8e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/hr-managers.js:62"}, "properties": {"repobilityId": "2d4b1c4d44fcebf6", "scanner": "scanner-primary", "fingerprint": "1b9036ac89879f8e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-72cec92f222f4ebd", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/sales-teams.js:62"}, "properties": {"repobilityId": "9682ea36ef935a00", "scanner": "scanner-primary", "fingerprint": "72cec92f222f4ebd", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-af4238175ad0ea32", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/marketing-professionals.js:131"}, "properties": {"repobilityId": "109443d30557a283", "scanner": "scanner-primary", "fingerprint": "af4238175ad0ea32", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-685dc7008ce2c89a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/content-creators.js:62"}, "properties": {"repobilityId": "aebfec8058894228", "scanner": "scanner-primary", "fingerprint": "685dc7008ce2c89a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-739ee390f31ea891", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/prompts/small-business-owners.js:62"}, "properties": {"repobilityId": "21fc01b5112cade8", "scanner": "scanner-primary", "fingerprint": "739ee390f31ea891", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d372c7353282d012", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/model-prompting-guide/index.js:27"}, "properties": {"repobilityId": "fafe00affcc78e5d", "scanner": "scanner-primary", "fingerprint": "d372c7353282d012", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9cb158bb52dfd200", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/model-prompting-guide/[model].js:39"}, "properties": {"repobilityId": "7e82f61a15f6bb64", "scanner": "scanner-primary", "fingerprint": "9cb158bb52dfd200", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3e96d4b5da6b6e3f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-prompt-cost.js:76"}, "properties": {"repobilityId": "4f76353759dc858f", "scanner": "scanner-primary", "fingerprint": "3e96d4b5da6b6e3f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1859a2c9f173232e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/customer-service-ai-savings.js:87"}, "properties": {"repobilityId": "43d764d76580eb2c", "scanner": "scanner-primary", "fingerprint": "1859a2c9f173232e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-526a1832eaa7fd5a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-model-selector.js:102"}, "properties": {"repobilityId": "7df85bb349358f6d", "scanner": "scanner-primary", "fingerprint": "526a1832eaa7fd5a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-dc5c25a362225bac", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-code-vs-cursor-cost.js:114"}, "properties": {"repobilityId": "eb7d423a6fa495d2", "scanner": "scanner-primary", "fingerprint": "dc5c25a362225bac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4b225e89161d2b3d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/claude-plan-picker.js:148"}, "properties": {"repobilityId": "a8370dd0fa4b685f", "scanner": "scanner-primary", "fingerprint": "4b225e89161d2b3d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0ba8be2649066e0c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/ecommerce-ai-savings.js:120"}, "properties": {"repobilityId": "4f46ce75c6b20b93", "scanner": "scanner-primary", "fingerprint": "0ba8be2649066e0c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1cf3a3e465b85835", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/business-ai-readiness.js:87"}, "properties": {"repobilityId": "208fa1652d7eb745", "scanner": "scanner-primary", "fingerprint": "1cf3a3e465b85835", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-805ce34c2fae3987", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/index.js:142"}, "properties": {"repobilityId": "76281508fc410d4d", "scanner": "scanner-primary", "fingerprint": "805ce34c2fae3987", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0b02debe77a3473f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/calculators/content-creation-speed.js:108"}, "properties": {"repobilityId": "813f07fbb7a541bc", "scanner": "scanner-primary", "fingerprint": "0b02debe77a3473f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-865271a63a0fc6df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 pages/ai-prompt-generator/enhanced.js:246"}, "properties": {"repobilityId": "45d431aaac6e63c1", "scanner": "scanner-primary", "fingerprint": "865271a63a0fc6df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-252015697d080ab2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-prompt-generator/index.js:237"}, "properties": {"repobilityId": "dd98b5f11f36d412", "scanner": "scanner-primary", "fingerprint": "252015697d080ab2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ec016e3fd6389b12", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 pages/ai-prompt-generator/[slug].js:50"}, "properties": {"repobilityId": "043a3c87f79b4808", "scanner": "scanner-primary", "fingerprint": "ec016e3fd6389b12", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1f98b1a55919bd76", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 netlify/functions/submission-created.js:125"}, "properties": {"repobilityId": "3e999cae271e46d4", "scanner": "scanner-primary", "fingerprint": "1f98b1a55919bd76", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d335532c410b76b1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/EnhancedMeta.js:94"}, "properties": {"repobilityId": "abb7f43d0bf0ad1d", "scanner": "scanner-primary", "fingerprint": "d335532c410b76b1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/EnhancedMeta.js"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-26132d877eb60fde", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/RichSnippets.js:143"}, "properties": {"repobilityId": "929009e0e3625757", "scanner": "scanner-primary", "fingerprint": "26132d877eb60fde", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/RichSnippets.js"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-2e66ce5cd7220add", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/YouTubeVideoSection.js:47"}, "properties": {"repobilityId": "7d774fa601a448c4", "scanner": "scanner-primary", "fingerprint": "2e66ce5cd7220add", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/YouTubeVideoSection.js"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-0eddb3d177529155", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/EnhancedSEO.js:73"}, "properties": {"repobilityId": "cebde6280eaea5b1", "scanner": "scanner-primary", "fingerprint": "0eddb3d177529155", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/EnhancedSEO.js"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-276d53421234e0ff", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/OptimizedImage.js:63"}, "properties": {"repobilityId": "2c1015fe8e27d8a2", "scanner": "scanner-primary", "fingerprint": "276d53421234e0ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/OptimizedImage.js"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-efa8958375a8e52e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/CalculatorSchema.js:108"}, "properties": {"repobilityId": "3410c4df28d84b65", "scanner": "scanner-primary", "fingerprint": "efa8958375a8e52e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/CalculatorSchema.js"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-d7acab3f8f271417", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/OrganizationSchema.js:76"}, "properties": {"repobilityId": "7b43114f3fe541fd", "scanner": "scanner-primary", "fingerprint": "d7acab3f8f271417", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/OrganizationSchema.js"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-9899dd478a4ec9c2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/EnhancedFAQSchema.js:41"}, "properties": {"repobilityId": "0f6065c56f402570", "scanner": "scanner-primary", "fingerprint": "9899dd478a4ec9c2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/EnhancedFAQSchema.js"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-94c747d4779471de", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-mcp-stack.js:195"}, "properties": {"repobilityId": "8809b0209fdcebc9", "scanner": "scanner-primary", "fingerprint": "94c747d4779471de", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-code-mcp-stack.js"}, "region": {"startLine": 195}}}]}, {"ruleId": "scanner-8709f10a65490041", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/education-ai.js:127"}, "properties": {"repobilityId": "daf5385e760da37a", "scanner": "scanner-primary", "fingerprint": "8709f10a65490041", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/education-ai.js"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-e18373ac001fa542", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/vibe-coding.js:56"}, "properties": {"repobilityId": "ec3d55c602fe7666", "scanner": "scanner-primary", "fingerprint": "e18373ac001fa542", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/vibe-coding.js"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-489f69bf1944a59b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/best-ai-tools.js:658"}, "properties": {"repobilityId": "2ce4e465b54c7d03", "scanner": "scanner-primary", "fingerprint": "489f69bf1944a59b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/best-ai-tools.js"}, "region": {"startLine": 658}}}]}, {"ruleId": "scanner-30de22e9522b4305", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/replit-vs-lovable.js:161"}, "properties": {"repobilityId": "ace1c8ad263db798", "scanner": "scanner-primary", "fingerprint": "30de22e9522b4305", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/replit-vs-lovable.js"}, "region": {"startLine": 161}}}]}, {"ruleId": "scanner-ac8ec929e9f1c60a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/video-tutorials.js:127"}, "properties": {"repobilityId": "7d6c56170eafaef7", "scanner": "scanner-primary", "fingerprint": "ac8ec929e9f1c60a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/video-tutorials.js"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-a2fd4f82d4af78df", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/real-estate-ai.js:127"}, "properties": {"repobilityId": "a4ee179d02581688", "scanner": "scanner-primary", "fingerprint": "a2fd4f82d4af78df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/real-estate-ai.js"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-20326456ecf5fd0d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-pro-vs-max-vs-api.js:127"}, "properties": {"repobilityId": "dccf22bfbe4da72b", "scanner": "scanner-primary", "fingerprint": "20326456ecf5fd0d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-pro-vs-max-vs-api.js"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-91bc3afba1e47021", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-vs-cursor.js:144"}, "properties": {"repobilityId": "e4d99c4e832dabda", "scanner": "scanner-primary", "fingerprint": "91bc3afba1e47021", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-code-vs-cursor.js"}, "region": {"startLine": 144}}}]}, {"ruleId": "scanner-c998281a9d744bd2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-md-playbook.js:255"}, "properties": {"repobilityId": "a8b8c4e76bf0f217", "scanner": "scanner-primary", "fingerprint": "c998281a9d744bd2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-md-playbook.js"}, "region": {"startLine": 255}}}]}, {"ruleId": "scanner-86ec3e68795c13fd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/legal-ai.js:127"}, "properties": {"repobilityId": "854a93d6e23380a8", "scanner": "scanner-primary", "fingerprint": "86ec3e68795c13fd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/legal-ai.js"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-3fdceeca3cc3ef65", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/custom-ai-agents.js:298"}, "properties": {"repobilityId": "203636849d1d862c", "scanner": "scanner-primary", "fingerprint": "3fdceeca3cc3ef65", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/custom-ai-agents.js"}, "region": {"startLine": 298}}}]}, {"ruleId": "scanner-9f0e8b9690bed8ba", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/skills-vs-mcp-vs-hooks.js:132"}, "properties": {"repobilityId": "68aa854342d2182d", "scanner": "scanner-primary", "fingerprint": "9f0e8b9690bed8ba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/skills-vs-mcp-vs-hooks.js"}, "region": {"startLine": 132}}}]}, {"ruleId": "scanner-073fd798c30729d0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-guide.js:140"}, "properties": {"repobilityId": "2af64f50250436ec", "scanner": "scanner-primary", "fingerprint": "073fd798c30729d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-code-guide.js"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-c7adb5885ef2dda3", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-hooks-recipes.js:249"}, "properties": {"repobilityId": "74ef04f1c7056925", "scanner": "scanner-primary", "fingerprint": "c7adb5885ef2dda3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-code-hooks-recipes.js"}, "region": {"startLine": 249}}}]}, {"ruleId": "scanner-2edacf595d44c033", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/_document.js:16"}, "properties": {"repobilityId": "8a69d61206002146", "scanner": "scanner-primary", "fingerprint": "2edacf595d44c033", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/_document.js"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-2aede62a3e1bc926", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/vision-ai-prompts.js:137"}, "properties": {"repobilityId": "173accdefe623636", "scanner": "scanner-primary", "fingerprint": "2aede62a3e1bc926", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/vision-ai-prompts.js"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-71642e0cc2b5515c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/api-pricing.js:91"}, "properties": {"repobilityId": "74d6d0fcfa7e2cef", "scanner": "scanner-primary", "fingerprint": "71642e0cc2b5515c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/api-pricing.js"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-716808da88417c1c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/index.js:75"}, "properties": {"repobilityId": "6ebbeca72a033e37", "scanner": "scanner-primary", "fingerprint": "716808da88417c1c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/index.js"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-c2386e7616e39ece", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-vs-chatgpt.js:164"}, "properties": {"repobilityId": "139aa76780267095", "scanner": "scanner-primary", "fingerprint": "c2386e7616e39ece", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-vs-chatgpt.js"}, "region": {"startLine": 164}}}]}, {"ruleId": "scanner-72bd30613e2dd725", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/ai-models.js:185"}, "properties": {"repobilityId": "7c3159e0a3db0895", "scanner": "scanner-primary", "fingerprint": "72bd30613e2dd725", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/ai-models.js"}, "region": {"startLine": 185}}}]}, {"ruleId": "scanner-28742c633f9f7a15", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/healthcare-ai.js:127"}, "properties": {"repobilityId": "5f11cfea0ecca3e5", "scanner": "scanner-primary", "fingerprint": "28742c633f9f7a15", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/healthcare-ai.js"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-851dc76d3bf43e33", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/install-guide.js:103"}, "properties": {"repobilityId": "b9073d574e6bc740", "scanner": "scanner-primary", "fingerprint": "851dc76d3bf43e33", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-code-skills/install-guide.js"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-73ab6fff9a18b270", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/index.js:130"}, "properties": {"repobilityId": "2e18772091a1499f", "scanner": "scanner-primary", "fingerprint": "73ab6fff9a18b270", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-code-skills/index.js"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-2570439c02c6a9d4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/[slug].js:60"}, "properties": {"repobilityId": "a5bc510dc106034e", "scanner": "scanner-primary", "fingerprint": "2570439c02c6a9d4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-code-skills/[slug].js"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-77f46918b99611ed", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/build-your-own.js:69"}, "properties": {"repobilityId": "6c56cebdc09dc9a6", "scanner": "scanner-primary", "fingerprint": "77f46918b99611ed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-code-skills/build-your-own.js"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-309383ebda2c2193", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/claude-code-skills/category/[category].js:44"}, "properties": {"repobilityId": "71f8e72a1c6f1048", "scanner": "scanner-primary", "fingerprint": "309383ebda2c2193", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/claude-code-skills/category/[category].js"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-c96c0493314bb77c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/learn/index.js:38"}, "properties": {"repobilityId": "eaa1f70e60a2fc63", "scanner": "scanner-primary", "fingerprint": "c96c0493314bb77c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/learn/index.js"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-6ce2764b2ad06422", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/learn/[module].js:62"}, "properties": {"repobilityId": "9553a332e080b814", "scanner": "scanner-primary", "fingerprint": "6ce2764b2ad06422", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/learn/[module].js"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-99a9a728c10762e9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/observatory/index.js:46"}, "properties": {"repobilityId": "c397c0aa0fef7767", "scanner": "scanner-primary", "fingerprint": "99a9a728c10762e9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/observatory/index.js"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-bd28955a88a33dbb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/observatory/[date].js:52"}, "properties": {"repobilityId": "93c967a4424e0c2c", "scanner": "scanner-primary", "fingerprint": "bd28955a88a33dbb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/observatory/[date].js"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-5072daf7c2d1677e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/observatory/prompts/[id].js:65"}, "properties": {"repobilityId": "b8b8b23c67db93b7", "scanner": "scanner-primary", "fingerprint": "5072daf7c2d1677e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/observatory/prompts/[id].js"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-98f61f6a005acd04", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/ai-models/[slug].js:78"}, "properties": {"repobilityId": "8cc5e8251222d561", "scanner": "scanner-primary", "fingerprint": "98f61f6a005acd04", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/ai-models/[slug].js"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-dc053dbaa70cb9e1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/tools/mad-libs-prompt-creator.js:396"}, "properties": {"repobilityId": "3a0677ad7a924b05", "scanner": "scanner-primary", "fingerprint": "dc053dbaa70cb9e1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/tools/mad-libs-prompt-creator.js"}, "region": {"startLine": 396}}}]}, {"ruleId": "scanner-52ae39d133b96ef5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/tools/prompt-diagnostic-quiz.js:233"}, "properties": {"repobilityId": "379e7e47d75b8d14", "scanner": "scanner-primary", "fingerprint": "52ae39d133b96ef5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/tools/prompt-diagnostic-quiz.js"}, "region": {"startLine": 233}}}]}, {"ruleId": "scanner-15279b1b344f8568", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/chatgpt-prompts-for/[modifier].js:74"}, "properties": {"repobilityId": "40ee5234f8d7127a", "scanner": "scanner-primary", "fingerprint": "15279b1b344f8568", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/chatgpt-prompts-for/[modifier].js"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-dfc661bf9806afbb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/hr-managers.js:62"}, "properties": {"repobilityId": "10174ea344187c8a", "scanner": "scanner-primary", "fingerprint": "dfc661bf9806afbb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/prompts/hr-managers.js"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-ab51f31fae0e549c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/sales-teams.js:62"}, "properties": {"repobilityId": "e47f7a5aba00d2be", "scanner": "scanner-primary", "fingerprint": "ab51f31fae0e549c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/prompts/sales-teams.js"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-2151f52a68fb0899", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/marketing-professionals.js:131"}, "properties": {"repobilityId": "3b4a3ec72fb083c7", "scanner": "scanner-primary", "fingerprint": "2151f52a68fb0899", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/prompts/marketing-professionals.js"}, "region": {"startLine": 131}}}]}, {"ruleId": "scanner-1f3f11b74b609dd8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/content-creators.js:62"}, "properties": {"repobilityId": "d12d21a954023d0a", "scanner": "scanner-primary", "fingerprint": "1f3f11b74b609dd8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/prompts/content-creators.js"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-9e73cf65e54208a3", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/prompts/small-business-owners.js:62"}, "properties": {"repobilityId": "761bf399a2f6b352", "scanner": "scanner-primary", "fingerprint": "9e73cf65e54208a3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/prompts/small-business-owners.js"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-754cefeb42a43f73", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/model-prompting-guide/index.js:27"}, "properties": {"repobilityId": "847a55e39a25e240", "scanner": "scanner-primary", "fingerprint": "754cefeb42a43f73", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/model-prompting-guide/index.js"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-5e2febda42e1e64d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/model-prompting-guide/[model].js:39"}, "properties": {"repobilityId": "f75c63e4236d8e97", "scanner": "scanner-primary", "fingerprint": "5e2febda42e1e64d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/model-prompting-guide/[model].js"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-868c840b63399d45", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-prompt-cost.js:76"}, "properties": {"repobilityId": "107124fe4af21ef0", "scanner": "scanner-primary", "fingerprint": "868c840b63399d45", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/calculators/claude-prompt-cost.js"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-50d4b6bb3676256d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/customer-service-ai-savings.js:87"}, "properties": {"repobilityId": "eef13a283dd47b38", "scanner": "scanner-primary", "fingerprint": "50d4b6bb3676256d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/calculators/customer-service-ai-savings.js"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-28ec3837562bd37a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-model-selector.js:102"}, "properties": {"repobilityId": "69199c72aec88aaf", "scanner": "scanner-primary", "fingerprint": "28ec3837562bd37a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/calculators/claude-model-selector.js"}, "region": {"startLine": 102}}}]}, {"ruleId": "scanner-dce74ae793ae59f1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-code-vs-cursor-cost.js:114"}, "properties": {"repobilityId": "add40964d284d3f0", "scanner": "scanner-primary", "fingerprint": "dce74ae793ae59f1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/calculators/claude-code-vs-cursor-cost.js"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-72fd53e49e1ef461", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/claude-plan-picker.js:148"}, "properties": {"repobilityId": "42a8a55bb0a3f4fe", "scanner": "scanner-primary", "fingerprint": "72fd53e49e1ef461", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/calculators/claude-plan-picker.js"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-db44149d6fa5e9fd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/ecommerce-ai-savings.js:120"}, "properties": {"repobilityId": "11d69f7f2d864a24", "scanner": "scanner-primary", "fingerprint": "db44149d6fa5e9fd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/calculators/ecommerce-ai-savings.js"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-1164366d9596a2dc", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/business-ai-readiness.js:87"}, "properties": {"repobilityId": "0b998dd03aadfd34", "scanner": "scanner-primary", "fingerprint": "1164366d9596a2dc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/calculators/business-ai-readiness.js"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-e45b13800fad5e7e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/index.js:142"}, "properties": {"repobilityId": "c4b56ac6376d3991", "scanner": "scanner-primary", "fingerprint": "e45b13800fad5e7e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/calculators/index.js"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-3010c8cf2b2e8840", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/calculators/content-creation-speed.js:108"}, "properties": {"repobilityId": "51f47e01282d04b7", "scanner": "scanner-primary", "fingerprint": "3010c8cf2b2e8840", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/calculators/content-creation-speed.js"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-7a10971db0e57833", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/ai-prompt-generator/index.js:237"}, "properties": {"repobilityId": "4181e69cd5f40d4d", "scanner": "scanner-primary", "fingerprint": "7a10971db0e57833", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/ai-prompt-generator/index.js"}, "region": {"startLine": 237}}}]}, {"ruleId": "scanner-cf5077dfedac37df", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in pages/ai-prompt-generator/[slug].js:50"}, "properties": {"repobilityId": "53372f36cbe83c66", "scanner": "scanner-primary", "fingerprint": "cf5077dfedac37df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/ai-prompt-generator/[slug].js"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-cd5759e7b1e7d200", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f1c87434b55091d6", "scanner": "scanner-primary", "fingerprint": "cd5759e7b1e7d200", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/claude-pricing-drift.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-7cf6ab11df29562a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f0f87e9e95bcb302", "scanner": "scanner-primary", "fingerprint": "7cf6ab11df29562a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/observatory-weekly.yml"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-55687259afc85cd5", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "ea0aa73d05eb0903", "scanner": "scanner-primary", "fingerprint": "55687259afc85cd5", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/observatory-weekly.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2f5de680cec26b7e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d32264fc9ef9bb27", "scanner": "scanner-primary", "fingerprint": "2f5de680cec26b7e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ai-models-staleness-check.yml"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-2f5de680cec26b7e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d32264fc9ef9bb27", "scanner": "scanner-primary", "fingerprint": "2f5de680cec26b7e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ai-models-staleness-check.yml"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-6bac8d11dd66b0e1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "78d65b081fb46c99", "scanner": "scanner-primary", "fingerprint": "6bac8d11dd66b0e1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/observatory-weekly-email.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-de53ac274e5b4ecf", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "02600186fc092bd4", "scanner": "scanner-primary", "fingerprint": "de53ac274e5b4ecf", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/claude.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-de53ac274e5b4ecf", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c8b213e3d9be3781", "scanner": "scanner-primary", "fingerprint": "de53ac274e5b4ecf", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/claude.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-37716d9c0a33ad5c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "abfb5752158cf655", "scanner": "scanner-primary", "fingerprint": "37716d9c0a33ad5c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/claude.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-98aa187431404c05", "level": "note", "message": {"text": "Very large file: pages/custom-ai-agents.js (1215 lines)"}, "properties": {"repobilityId": "9e9293d244582891", "scanner": "scanner-primary", "fingerprint": "98aa187431404c05", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1774f7d998fe72dd", "level": "note", "message": {"text": "Very large file: pages/ai-glossary.js (1026 lines)"}, "properties": {"repobilityId": "f71f2a06acc14400", "scanner": "scanner-primary", "fingerprint": "1774f7d998fe72dd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d0b3f0357d839287", "level": "note", "message": {"text": "Very large file: pages/claude-code-guide.js (884 lines)"}, "properties": {"repobilityId": "f047988ac68ff76d", "scanner": "scanner-primary", "fingerprint": "d0b3f0357d839287", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-84e8b09381fdcab9", "level": "note", "message": {"text": "Very large file: pages/ai-prompt-generator/index.js (1305 lines)"}, "properties": {"repobilityId": "0815922647c6d100", "scanner": "scanner-primary", "fingerprint": "84e8b09381fdcab9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "59b5c06629a73763", "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": "2b551f2cf304a7cf", "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": "099b939b7453da88", "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": "95b9f63f0c254165", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "95686e92ff45410a", "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": "42e4b333752752cc", "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": "93ef3ee280498059", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8b61cf3bbbef67b3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/code-reviewer.md"}, "properties": {"repobilityId": "5bdbcbe505ae9cd6", "scanner": "scanner-primary", "fingerprint": "8b61cf3bbbef67b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/code-reviewer.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-470336fdd7a17b7c", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/seo-specialist.md"}, "properties": {"repobilityId": "fa1f1ffcc0b5ec16", "scanner": "scanner-primary", "fingerprint": "470336fdd7a17b7c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/seo-specialist.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d55d8d9d675eb5bc", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/security-reviewer.md"}, "properties": {"repobilityId": "1592e6ea0573e0f6", "scanner": "scanner-primary", "fingerprint": "d55d8d9d675eb5bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/security-reviewer.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-77dcec51528a4ebd", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/check-claude-pricing-drift.js:7"}, "properties": {"repobilityId": "bd4fb53e7d77d672", "scanner": "scanner-primary", "fingerprint": "77dcec51528a4ebd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b662c1df30131cb", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/observatory/open_pr.py:98"}, "properties": {"repobilityId": "d6c4358dfc24c84a", "scanner": "scanner-primary", "fingerprint": "5b662c1df30131cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-63086101fa06aade", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/observatory/tests/test_integration_pipeline.py:59"}, "properties": {"repobilityId": "604697d2284f54a3", "scanner": "scanner-primary", "fingerprint": "63086101fa06aade", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8eb3d1ec733c431d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai/LiveChatTester.js:58"}, "properties": {"repobilityId": "0f09e773c0433e5d", "scanner": "scanner-primary", "fingerprint": "8eb3d1ec733c431d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-18d92fbe090e8f92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/ai/PromptOptimizer.js:209"}, "properties": {"repobilityId": "ecd811b02f3a502a", "scanner": "scanner-primary", "fingerprint": "18d92fbe090e8f92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5bde53494ac34cbf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/tools/BusinessNameGenerator.js:59"}, "properties": {"repobilityId": "f968a4deeac360c8", "scanner": "scanner-primary", "fingerprint": "5bde53494ac34cbf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bf686904a490eeb2", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/critique/judge.js:5"}, "properties": {"repobilityId": "63e2008c5011a911", "scanner": "scanner-primary", "fingerprint": "bf686904a490eeb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ecbc1ab4f235326", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/templates/index.js:4"}, "properties": {"repobilityId": "68735ec32a4c6928", "scanner": "scanner-primary", "fingerprint": "9ecbc1ab4f235326", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59ccc7977587755a", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/studio/entitlements.js:6"}, "properties": {"repobilityId": "e06b0b8d1ae8519c", "scanner": "scanner-primary", "fingerprint": "59ccc7977587755a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e8aa178334a12a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/gateway/openrouter.js:3"}, "properties": {"repobilityId": "06821cf6ee629423", "scanner": "scanner-primary", "fingerprint": "9e8aa178334a12a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8796690b11882b41", "level": "none", "message": {"text": "Commented-code block (9 lines) in lib/gateway/index.js:10"}, "properties": {"repobilityId": "85955b77f21a6a25", "scanner": "scanner-primary", "fingerprint": "8796690b11882b41", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-edf2c1ebe977fe16", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/ai/chat.js:71"}, "properties": {"repobilityId": "af7482adafd70dd8", "scanner": "scanner-primary", "fingerprint": "edf2c1ebe977fe16", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-11717c7d9505a67d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/ai/optimize.js:126"}, "properties": {"repobilityId": "dd78e53edd8a3a4c", "scanner": "scanner-primary", "fingerprint": "11717c7d9505a67d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d6ae507dfba2e088", "level": "none", "message": {"text": "Commented-code block (5 lines) in pages/api/studio/templates.js:1"}, "properties": {"repobilityId": "1e7d19384e39331c", "scanner": "scanner-primary", "fingerprint": "d6ae507dfba2e088", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87a6e218580a53ac", "level": "none", "message": {"text": "Commented-code block (5 lines) in pages/api/studio/run.js:4"}, "properties": {"repobilityId": "9bda6d9b2e76e5c8", "scanner": "scanner-primary", "fingerprint": "87a6e218580a53ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-83ff8ab71acff9ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in netlify/functions/submission-created.js:1"}, "properties": {"repobilityId": "94e99e3fc54e2b65", "scanner": "scanner-primary", "fingerprint": "83ff8ab71acff9ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "ed9adaa00b6b2bf7", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "356f630294b3fcaa", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}