{"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-0bb9bedd03bdf169", "name": "Stray `console.log` in TS/JS \u2014 scripts/publish-aeo-lesson.ts:183", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/publish-aeo-lesson.ts:183"}, "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-3b2225c5191f5599", "name": "Stray `console.log` in TS/JS \u2014 scripts/translate-messages.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/translate-messages.ts:58"}, "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-b7f8cf5ef92b31ad", "name": "Stray `console.log` in TS/JS \u2014 scripts/shuffle-answers.js:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/shuffle-answers.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-924e5512bf93ecb7", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-v2-courses.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-v2-courses.ts:28"}, "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-ae0341da302564cb", "name": "Stray `console.log` in TS/JS \u2014 scripts/ping-indexnow.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ping-indexnow.ts:44"}, "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-ac4fab26e58403ee", "name": "Stray `console.log` in TS/JS \u2014 scripts/create-affiliate-coupons.ts:174", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-affiliate-coupons.ts:174"}, "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-693c87f93a28c505", "name": "Stray `console.log` in TS/JS \u2014 scripts/translate-seed.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/translate-seed.ts:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c0e7c60498b7bea2", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-courses.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-courses.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb154d19dd0164eb", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-aeo-exercises.ts:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-aeo-exercises.ts:102"}, "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-fcd3d449e7a9744c", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-db.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-db.ts:69"}, "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-2a347bb7ad9f09fa", "name": "Stray `console.log` in TS/JS \u2014 scripts/reseed-course.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reseed-course.ts:92"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa426fb8db0a9e76", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ContinueWhereYouLeftOff.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ContinueWhereYouLeftOff.tsx:60"}, "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-daa2837f8cf03dc6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/LessonJsonLd.tsx:53", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/LessonJsonLd.tsx:53"}, "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-d341a51d99cb68ed", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/SanitizedHtml.tsx:18", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/SanitizedHtml.tsx:18"}, "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-2df3a6ceafeb9d77", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/FaqJsonLd.tsx:41", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/FaqJsonLd.tsx: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-72f3d8937e07d89f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/CourseJsonLd.tsx:51", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/CourseJsonLd.tsx:51"}, "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-83a7f979e83004bd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/MidLessonSignupBar.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MidLessonSignupBar.tsx:99"}, "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-3b7dbc03eb8e3217", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/BreadcrumbJsonLd.tsx:31", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/BreadcrumbJsonLd.tsx:31"}, "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-9915c239e5041acd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/gamification/BadgeUnlockedCelebration.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/gamification/BadgeUnlockedCelebration.tsx:112"}, "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-21e02388c9a7b07c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/page.tsx:91", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/page.tsx: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-76ab1120aae3c315", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/layout.tsx:128", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/layout.tsx:128"}, "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-76cc7a9cbdf3458b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-for-business/page.tsx:138", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-for-business/page.tsx:138"}, "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-fccf7f43e75595be", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-agents/page.tsx:138", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-agents/page.tsx:138"}, "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-c73d15bebea7a2b2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-data-analysis/page.tsx:196", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-data-analysis/page.tsx:196"}, "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-64ece6676d8c3436", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/learn/page.tsx:72", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/learn/page.tsx:72"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c9f1474839fc5e80", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-mcp-servers/page.tsx:151", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-mcp-servers/page.tsx:151"}, "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-2e0c61aadfa4f965", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-cheat-sheet/page.tsx:115", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-cheat-sheet/page.tsx:115"}, "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-174ea673c681d9c0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-api-tutorial/page.tsx:132", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-api-tutorial/page.tsx: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-b5c971ac310fd6db", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-developers/page.tsx:148", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-developers/page.tsx: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-4cfe88d4e23dd216", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-automation/page.tsx:142", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-automation/page.tsx: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-953dbb377297c81c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-extended-thinking/page.tsx:155", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-extended-thinking/page.tsx:155"}, "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-be3f3530b44c2c85", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/learn-ai/page.tsx:140", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/learn-ai/page.tsx: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-8650ba7fbae4663c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-tutorial/page.tsx:210", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-tutorial/page.tsx:210"}, "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-8f96b557bc7c9cf0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-api-tutorial/page.tsx:130", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-api-tutorial/page.tsx: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-31755caadfa59b20", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-prompts/page.tsx:137", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-prompts/page.tsx: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-7f9f9f85d177f840", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-tool-use/page.tsx:165", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-tool-use/page.tsx:165"}, "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-b980246ab6f500f2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/what-is-claude/page.tsx:170", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/what-is-claude/page.tsx:170"}, "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-0bd24df48ddd7566", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-certification/page.tsx:136", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-certification/page.tsx:136"}, "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-33b8d805b955fdce", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-pair-programming/page.tsx:138", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-pair-programming/page.tsx:138"}, "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-8c429770bc8d75e9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/best-claude-prompts/page.tsx:235", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/best-claude-prompts/page.tsx:235"}, "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-cf5ca64b8b984f41", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-for-python/page.tsx:125", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-for-python/page.tsx:125"}, "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-30801eab3b23ebcb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-batch-api/page.tsx:171", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-batch-api/page.tsx:171"}, "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-e3ae2168d616ef5d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-marketing/page.tsx:144", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-marketing/page.tsx: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-4dbbb305b6d9674e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/custom-gpts-tutorial/page.tsx:136", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/custom-gpts-tutorial/page.tsx:136"}, "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-73d2ca1d79709e92", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-projects/page.tsx:109", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-projects/page.tsx:109"}, "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-8f44710ff19aee23", "name": "TODO/FIXME marker in shipping code \u2014 src/app/[locale]/claude-memory/page.tsx:281", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/[locale]/claude-memory/page.tsx:281"}, "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-92b3420929bf2f93", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-memory/page.tsx:109", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-memory/page.tsx:109"}, "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-b098e30d85becd58", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-vs-copilot/page.tsx:154", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-vs-copilot/page.tsx:154"}, "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-1290e0b77a4a9dab", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-slash-commands/page.tsx:130", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-slash-commands/page.tsx: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-5ff947960afdb4b5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/getting-started/page.tsx:74", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/getting-started/page.tsx: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-b0d000d0f535870d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-system-prompts/page.tsx:196", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-system-prompts/page.tsx:196"}, "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-05e83a41bbaba079", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-vs-cursor/page.tsx:167", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-vs-cursor/page.tsx:167"}, "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-25801ed633f53c53", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/is-claude-free/page.tsx:129", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/is-claude-free/page.tsx:129"}, "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-9c8364e4963e28c4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-business/page.tsx:199", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-business/page.tsx:199"}, "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-0d7c581b531ab792", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-sonnet-vs-opus/page.tsx:153", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-sonnet-vs-opus/page.tsx:153"}, "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-e374085e1529a21a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-for-beginners/page.tsx:104", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-for-beginners/page.tsx:104"}, "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-04bc7f2b608084f4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-tips/page.tsx:140", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-tips/page.tsx: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-9acfe373f7e38bf4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-debugging/page.tsx:125", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-debugging/page.tsx:125"}, "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-3237df999c9b7ce3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/for-teams/page.tsx:72", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/for-teams/page.tsx:72"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e201d6b70a28360e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-training/page.tsx:115", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-training/page.tsx:115"}, "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-b11c24436fdfba4f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/certification/page.tsx:72", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/certification/page.tsx:72"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9029e12d94fadc54", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-security/page.tsx:163", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-security/page.tsx:163"}, "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-1ec8ecb062733c07", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(app)/projects/[slug]/ProjectShellClient.tsx:337", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(app)/projects/[slug]/ProjectShellClient.tsx:337"}, "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-61a2ee85c51cb2f2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(app)/courses/[slug]/page.tsx:459", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(app)/courses/[slug]/page.tsx:459"}, "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-ce08e95d714d4099", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/learn-chatgpt/page.tsx:112", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/learn-chatgpt/page.tsx:112"}, "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-fe7dad61d58a42e9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-vs-chatgpt/page.tsx:154", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-vs-chatgpt/page.tsx:154"}, "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-54b9f33ee54f64f8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-artifacts/page.tsx:147", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-artifacts/page.tsx:147"}, "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-1e238149fd97727a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/curriculum/page.tsx:176", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/curriculum/page.tsx:176"}, "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-eeb9e3f9f62a1570", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-projects/page.tsx:119", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-projects/page.tsx:119"}, "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-a2204fe487f82bd0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-vs-gemini/page.tsx:157", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-vs-gemini/page.tsx:157"}, "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-8e7db3bc0f1a03ea", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-non-programmers/page.tsx:168", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-non-programmers/page.tsx:168"}, "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-906f01f0267f5647", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/prompt-engineering/page.tsx:85", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/prompt-engineering/page.tsx:85"}, "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-f108d7659809d244", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-writers/page.tsx:158", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-writers/page.tsx:158"}, "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-ec73bd65af4ddfdd", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code/page.tsx:85", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code/page.tsx:85"}, "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-a5230e42ec978172", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-hooks/page.tsx:181", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-hooks/page.tsx:181"}, "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-9fdbb33c863b453f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-for-beginners/page.tsx:141", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-for-beginners/page.tsx:141"}, "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-fdd070a6a549157d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-multi-agent/page.tsx:137", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-multi-agent/page.tsx: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-f71d6a45251e8189", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-tdd/page.tsx:125", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-tdd/page.tsx:125"}, "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-344bf6400f2284ef", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-context-window/page.tsx:154", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-context-window/page.tsx:154"}, "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-24fd7264ef1ddb16", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-tutorial/page.tsx:131", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-tutorial/page.tsx: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-0a3508a8f271c94c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/how-to-use-chatgpt/page.tsx:104", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/how-to-use-chatgpt/page.tsx:104"}, "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-787df8a320817cb5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-vs-claude/page.tsx:152", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-vs-claude/page.tsx:152"}, "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-763fa27a7b284e7f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-setup/page.tsx:130", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-setup/page.tsx: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-2cc23c12468c4f42", "name": "Stray `console.log` in TS/JS \u2014 src/lib/slack-signups.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/slack-signups.ts:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb95a869aa38cdc4", "name": "Insecure pattern 'exec_used' in content/seed/archive/track4-api-agents.json:437", "shortDescription": {"text": "Insecure pattern 'exec_used' in content/seed/archive/track4-api-agents.json:437"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-994ae82a97776805", "name": "Possible secret in content/seed/archive/track3-claude-code.json", "shortDescription": {"text": "Possible secret in content/seed/archive/track3-claude-code.json"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-76820f9ccc26136a", "name": "Insecure pattern 'eval_used' in content/seed/archive/track3-claude-code.json:1364", "shortDescription": {"text": "Insecure pattern 'eval_used' in content/seed/archive/track3-claude-code.json:1364"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec0b9fff7f3c189d", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/LessonJsonLd.tsx:53", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/LessonJsonLd.tsx:53"}, "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-4b3d487d37fd3d7f", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/FaqJsonLd.tsx:41", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/FaqJsonLd.tsx: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-55e896f9049afabe", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/CourseJsonLd.tsx:51", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/CourseJsonLd.tsx:51"}, "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-b4dbb76b5ff29c11", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/BreadcrumbJsonLd.tsx:31", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/BreadcrumbJsonLd.tsx:31"}, "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-ece16fe8403ac33d", "name": "Insecure pattern 'document_write' in src/components/CompletionCertificate.tsx:56", "shortDescription": {"text": "Insecure pattern 'document_write' in src/components/CompletionCertificate.tsx:56"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b2c90d02448aa4db", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/page.tsx:91", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/page.tsx: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-d621ba053d932c4e", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/layout.tsx:128", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/layout.tsx:128"}, "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-7988694c8ca66baf", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-for-business/page.tsx:138", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-for-business/page.tsx:138"}, "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-d1a7078c4f5e9b26", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-agents/page.tsx:138", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-agents/page.tsx:138"}, "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-00447b23339bb25c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-data-analysis/page.tsx:196", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-data-analysis/page.tsx:196"}, "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-ed5b7068f018d407", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/learn/page.tsx:72", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/learn/page.tsx:72"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d3b5678018a96f0a", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-mcp-servers/page.tsx:151", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-mcp-servers/page.tsx:151"}, "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-e28d6f7a5be81c3a", "name": "Insecure pattern 'subprocess_shell_true' in src/app/[locale]/claude-code-cheat-sheet/page.tsx:85", "shortDescription": {"text": "Insecure pattern 'subprocess_shell_true' in src/app/[locale]/claude-code-cheat-sheet/page.tsx:85"}, "fullDescription": {"text": "Found a known-risky pattern (subprocess_shell_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c217de7e99864c70", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-cheat-sheet/page.tsx:115", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-cheat-sheet/page.tsx:115"}, "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-43180b1dc10dfc17", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-api-tutorial/page.tsx:132", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-api-tutorial/page.tsx: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-cd548d1788f818b0", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-developers/page.tsx:148", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-developers/page.tsx: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-19b9b216f26dcdf3", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-automation/page.tsx:142", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-automation/page.tsx: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-b14b2e81b77293f5", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-extended-thinking/page.tsx:155", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-extended-thinking/page.tsx:155"}, "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-572f8d5929e01e1f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/learn-ai/page.tsx:140", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/learn-ai/page.tsx: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-9c7f472cc8036aa2", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-tutorial/page.tsx:210", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-tutorial/page.tsx:210"}, "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-6f00b9d13511ad14", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-api-tutorial/page.tsx:130", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-api-tutorial/page.tsx: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-d5d41d2dfe5c646a", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-prompts/page.tsx:137", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-prompts/page.tsx: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-5027604bc49b5cfb", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-tool-use/page.tsx:165", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-tool-use/page.tsx:165"}, "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-eb69e400a19e4ec1", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/what-is-claude/page.tsx:170", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/what-is-claude/page.tsx:170"}, "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-6411e79609ad6a10", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-certification/page.tsx:136", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-certification/page.tsx:136"}, "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-0580a0fac17df472", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-pair-programming/page.tsx:138", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-pair-programming/page.tsx:138"}, "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-0793ea19aee921d9", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/best-claude-prompts/page.tsx:235", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/best-claude-prompts/page.tsx:235"}, "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-b56e2de92138a48e", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-for-python/page.tsx:125", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-for-python/page.tsx:125"}, "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-afcc216de83044a7", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-batch-api/page.tsx:171", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-batch-api/page.tsx:171"}, "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-b3b61eb0c24ac88c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-marketing/page.tsx:144", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-marketing/page.tsx: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-6ef929dbbf411c8e", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/custom-gpts-tutorial/page.tsx:136", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/custom-gpts-tutorial/page.tsx:136"}, "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-3d6c94144662a3af", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-projects/page.tsx:109", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-projects/page.tsx:109"}, "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-98974d1f5b9977cc", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-memory/page.tsx:109", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-memory/page.tsx:109"}, "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-07b843c224a211fe", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-vs-copilot/page.tsx:154", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-vs-copilot/page.tsx:154"}, "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-f9f92d6b14b6ba77", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-slash-commands/page.tsx:130", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-slash-commands/page.tsx: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-02bad7c1d8b6b0ec", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/getting-started/page.tsx:74", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/getting-started/page.tsx: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-c10a00573b25dfef", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-system-prompts/page.tsx:196", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-system-prompts/page.tsx:196"}, "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-6ebdff00a19ef7fe", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-vs-cursor/page.tsx:167", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-vs-cursor/page.tsx:167"}, "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-90eb3c77b560b296", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/is-claude-free/page.tsx:129", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/is-claude-free/page.tsx:129"}, "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-8088193bcd3a5dce", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-business/page.tsx:199", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-business/page.tsx:199"}, "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-6ba970d75608d5ff", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-sonnet-vs-opus/page.tsx:153", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-sonnet-vs-opus/page.tsx:153"}, "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-44dd2a7ed391dbc1", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-for-beginners/page.tsx:104", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-for-beginners/page.tsx:104"}, "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-94184ab5b8bcc8d6", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-tips/page.tsx:140", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-tips/page.tsx: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-6909a6a371f86526", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-debugging/page.tsx:125", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-debugging/page.tsx:125"}, "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-5a14820682f0d426", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/for-teams/page.tsx:72", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/for-teams/page.tsx:72"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5e8c98a660389df0", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-training/page.tsx:115", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-training/page.tsx:115"}, "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-302872ee5dc58d77", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/certification/page.tsx:72", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/certification/page.tsx:72"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-23c50e76df3ce6c5", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-security/page.tsx:163", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-security/page.tsx:163"}, "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-2c9ecfccc728d5bb", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/learn-chatgpt/page.tsx:112", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/learn-chatgpt/page.tsx:112"}, "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-4823d50d2f45d523", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-vs-chatgpt/page.tsx:154", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-vs-chatgpt/page.tsx:154"}, "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-8de91ad0ff09ea5f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-artifacts/page.tsx:147", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-artifacts/page.tsx:147"}, "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-dd18e3fce35cda64", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/curriculum/page.tsx:176", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/curriculum/page.tsx:176"}, "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-ba86fb02edc55d79", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-projects/page.tsx:119", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-projects/page.tsx:119"}, "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-5952c6ea0b3a5581", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-vs-gemini/page.tsx:157", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-vs-gemini/page.tsx:157"}, "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-5a2362e7d89aef6c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-non-programmers/page.tsx:168", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-non-programmers/page.tsx:168"}, "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-0bf1f778d7f38589", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/prompt-engineering/page.tsx:85", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/prompt-engineering/page.tsx:85"}, "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-8d731005ee277614", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-writers/page.tsx:158", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-writers/page.tsx:158"}, "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-79ed660c82337136", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code/page.tsx:85", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code/page.tsx:85"}, "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-3bc745cb26169b76", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-hooks/page.tsx:181", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-hooks/page.tsx:181"}, "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-c69488fff57813eb", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-for-beginners/page.tsx:141", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-for-beginners/page.tsx:141"}, "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-bdc389dabce3537a", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-multi-agent/page.tsx:137", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-multi-agent/page.tsx: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-d3907a57718d9dc5", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-tdd/page.tsx:125", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-tdd/page.tsx:125"}, "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-e27e6337fd745857", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-context-window/page.tsx:154", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-context-window/page.tsx:154"}, "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-a277249c4014439d", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-tutorial/page.tsx:131", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-tutorial/page.tsx: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-195e4344cbef9cd8", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/how-to-use-chatgpt/page.tsx:104", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/how-to-use-chatgpt/page.tsx:104"}, "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-a38fba2ad325e17c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-vs-claude/page.tsx:152", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-vs-claude/page.tsx:152"}, "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-a3a62ee77ad29cd2", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-setup/page.tsx:130", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-setup/page.tsx: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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 230 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 80 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 48 placeholder/mock markers across 16 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-caeaa3018fa893c8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ping-indexnow.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ping-indexnow.ts:21"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e0b9cf7ffe4790fc", "name": "Commented-code block (8 lines) in scripts/reseed-course.ts:24", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/reseed-course.ts:24"}, "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-cf790dc40a44dc14", "name": "Legacy-named symbol `sa_v1` in src/proxy.ts:144", "shortDescription": {"text": "Legacy-named symbol `sa_v1` in src/proxy.ts:144"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb6f5762647bb896", "name": "Commented-code block (5 lines) in src/proxy.ts:37", "shortDescription": {"text": "Commented-code block (5 lines) in src/proxy.ts:37"}, "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-b04ebd9cbbf9fe90", "name": "Commented-code block (12 lines) in src/i18n/routing.ts:20", "shortDescription": {"text": "Commented-code block (12 lines) in src/i18n/routing.ts:20"}, "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-af5283a8b3ea0ee2", "name": "Commented-code block (5 lines) in src/components/MidLessonSignupBar.tsx:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/MidLessonSignupBar.tsx: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-87bf270310da9cc3", "name": "Commented-code block (5 lines) in src/components/CheckoutStatusBanner.tsx:12", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/CheckoutStatusBanner.tsx:12"}, "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-8175a6931ab3e84d", "name": "Commented-code block (14 lines) in src/app/sitemap.ts:24", "shortDescription": {"text": "Commented-code block (14 lines) in src/app/sitemap.ts:24"}, "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-71c7ba10eeee110f", "name": "Commented-code block (6 lines) in src/app/api/daily-challenge/complete/route.ts:75", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/daily-challenge/complete/route.ts:75"}, "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-277bf1a29bf35a3a", "name": "Legacy-named symbol `sa_v1` in src/app/api/auth/callback/route.ts:203", "shortDescription": {"text": "Legacy-named symbol `sa_v1` in src/app/api/auth/callback/route.ts:203"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9527199342d83ec4", "name": "Commented-code block (6 lines) in src/app/api/auth/callback/route.ts:140", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/auth/callback/route.ts:140"}, "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-ef03be9d282f123d", "name": "Commented-code block (5 lines) in src/app/api/exercises/check/route.ts:99", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exercises/check/route.ts:99"}, "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-076af1c1b0252921", "name": "Commented-code block (6 lines) in src/app/api/projects/progress/route.ts:12", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/projects/progress/route.ts:12"}, "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-5973ba3f59858c64", "name": "Commented-code block (5 lines) in src/app/api/cron/streak-reminder/route.ts:133", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/cron/streak-reminder/route.ts:133"}, "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-bf79aadab8168f7f", "name": "Commented-code block (5 lines) in src/app/api/checkout/route.ts:146", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/checkout/route.ts:146"}, "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-9abed5280d8f3c5d", "name": "Commented-code block (7 lines) in src/app/api/checkout/masterclass/route.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/checkout/masterclass/route.ts: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-1c442bd18906732a", "name": "Legacy-named symbol `fromLegacy` in src/app/api/webhooks/stripe/route.ts:37", "shortDescription": {"text": "Legacy-named symbol `fromLegacy` in src/app/api/webhooks/stripe/route.ts:37"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c81f3673f4a297e8", "name": "Legacy-named symbol `labelOld` in src/app/[locale]/page.tsx:242", "shortDescription": {"text": "Legacy-named symbol `labelOld` in src/app/[locale]/page.tsx:242"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-16724558405eb388", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/[locale]/layout.tsx:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/[locale]/layout.tsx:129"}, "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-ab32c2b3d93b7344", "name": "Commented-code block (6 lines) in src/app/[locale]/(app)/projects/[slug]/page.tsx:9", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/[locale]/(app)/projects/[slug]/page.tsx:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a65f8ebf2f3155b9", "name": "Commented-code block (5 lines) in src/app/[locale]/(app)/projects/[slug]/ProjectShellClient.tsx:21", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/[locale]/(app)/projects/[slug]/ProjectShellClient.tsx:21"}, "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-04f9b9fad01b9369", "name": "Commented-code block (5 lines) in src/app/[locale]/(app)/courses/[slug]/[lesson]/LessonPlayerClient.tsx:37", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/[locale]/(app)/courses/[slug]/[lesson]/LessonPlayerClient.tsx:37"}, "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-d07614b6bd7d6fa8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/[locale]/(app)/courses/[slug]/[lesson]/LessonPlayerClient.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/[locale]/(app)/courses/[slug]/[lesson]/LessonPlayerClient.tsx:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e705b35665bbdb5", "name": "Commented-code block (5 lines) in src/app/[locale]/masterclass/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/[locale]/masterclass/page.tsx: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-67051643777e532d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/analytics.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/analytics.ts:6"}, "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-9d9623c01528bdb1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/local-progress.ts:177", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/local-progress.ts:177"}, "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-030da566069872e9", "name": "15 env vars used in code but missing from .env.example", "shortDescription": {"text": "15 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ACADEMY_SLACK_SIGNUPS_WEBHOOK`, `ACADEMY_SUPABASE_SERVICE_ROLE_KEY`, `ACADEMY_SUPABASE_URL`, `ALERT_EMAIL`, `BING_SITE_VERIFICATION`, `GEMINI_API_KEY`, `GOOGLE_SITE_VERIFICATION`, `INDEXNOW_SECRET` + 7 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/17906"}, "properties": {"repository": "Rchong01010/learntogpt", "repoUrl": "https://github.com/Rchong01010/learntogpt", "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-0bb9bedd03bdf169", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/publish-aeo-lesson.ts:183"}, "properties": {"repobilityId": "5f79b5e364f70455", "scanner": "scanner-primary", "fingerprint": "0bb9bedd03bdf169", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b2225c5191f5599", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/translate-messages.ts:58"}, "properties": {"repobilityId": "934d6d6c294931c9", "scanner": "scanner-primary", "fingerprint": "3b2225c5191f5599", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b7f8cf5ef92b31ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/shuffle-answers.js:97"}, "properties": {"repobilityId": "6f5730bd0d0310a3", "scanner": "scanner-primary", "fingerprint": "b7f8cf5ef92b31ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-924e5512bf93ecb7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-v2-courses.ts:28"}, "properties": {"repobilityId": "a14a7504798e84d2", "scanner": "scanner-primary", "fingerprint": "924e5512bf93ecb7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ae0341da302564cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ping-indexnow.ts:44"}, "properties": {"repobilityId": "b9689d232559cbec", "scanner": "scanner-primary", "fingerprint": "ae0341da302564cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac4fab26e58403ee", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-affiliate-coupons.ts:174"}, "properties": {"repobilityId": "0cb4cc7a4728b27b", "scanner": "scanner-primary", "fingerprint": "ac4fab26e58403ee", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-693c87f93a28c505", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/translate-seed.ts:62"}, "properties": {"repobilityId": "ee3fe4cc5f3de3ae", "scanner": "scanner-primary", "fingerprint": "693c87f93a28c505", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c0e7c60498b7bea2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-courses.ts:31"}, "properties": {"repobilityId": "887890867f3ccbf8", "scanner": "scanner-primary", "fingerprint": "c0e7c60498b7bea2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb154d19dd0164eb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-aeo-exercises.ts:102"}, "properties": {"repobilityId": "517882c9ed858920", "scanner": "scanner-primary", "fingerprint": "eb154d19dd0164eb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fcd3d449e7a9744c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-db.ts:69"}, "properties": {"repobilityId": "2b5f100206c8ad15", "scanner": "scanner-primary", "fingerprint": "fcd3d449e7a9744c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a347bb7ad9f09fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reseed-course.ts:92"}, "properties": {"repobilityId": "8aac9f312c4ba2df", "scanner": "scanner-primary", "fingerprint": "2a347bb7ad9f09fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa426fb8db0a9e76", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ContinueWhereYouLeftOff.tsx:60"}, "properties": {"repobilityId": "92e9c4152649767c", "scanner": "scanner-primary", "fingerprint": "aa426fb8db0a9e76", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-daa2837f8cf03dc6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/LessonJsonLd.tsx:53"}, "properties": {"repobilityId": "3bb906a20f7ff901", "scanner": "scanner-primary", "fingerprint": "daa2837f8cf03dc6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d341a51d99cb68ed", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/SanitizedHtml.tsx:18"}, "properties": {"repobilityId": "930e5419f338293e", "scanner": "scanner-primary", "fingerprint": "d341a51d99cb68ed", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2df3a6ceafeb9d77", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/FaqJsonLd.tsx:41"}, "properties": {"repobilityId": "98d0114da7ba5e0b", "scanner": "scanner-primary", "fingerprint": "2df3a6ceafeb9d77", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-72f3d8937e07d89f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/CourseJsonLd.tsx:51"}, "properties": {"repobilityId": "a0cf48e6d162a8ea", "scanner": "scanner-primary", "fingerprint": "72f3d8937e07d89f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-83a7f979e83004bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MidLessonSignupBar.tsx:99"}, "properties": {"repobilityId": "36491df0df9815fd", "scanner": "scanner-primary", "fingerprint": "83a7f979e83004bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b7dbc03eb8e3217", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/BreadcrumbJsonLd.tsx:31"}, "properties": {"repobilityId": "061fb5f8aa19307d", "scanner": "scanner-primary", "fingerprint": "3b7dbc03eb8e3217", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9915c239e5041acd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/gamification/BadgeUnlockedCelebration.tsx:112"}, "properties": {"repobilityId": "4b91f60ab41fce89", "scanner": "scanner-primary", "fingerprint": "9915c239e5041acd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21e02388c9a7b07c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/page.tsx:91"}, "properties": {"repobilityId": "e4c68e30127bf9a9", "scanner": "scanner-primary", "fingerprint": "21e02388c9a7b07c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-76ab1120aae3c315", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/layout.tsx:128"}, "properties": {"repobilityId": "de918fa54268f3b9", "scanner": "scanner-primary", "fingerprint": "76ab1120aae3c315", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-76cc7a9cbdf3458b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-for-business/page.tsx:138"}, "properties": {"repobilityId": "19093d89eac79eec", "scanner": "scanner-primary", "fingerprint": "76cc7a9cbdf3458b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fccf7f43e75595be", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-agents/page.tsx:138"}, "properties": {"repobilityId": "0a171e8dd53cb180", "scanner": "scanner-primary", "fingerprint": "fccf7f43e75595be", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c73d15bebea7a2b2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-data-analysis/page.tsx:196"}, "properties": {"repobilityId": "c1fffa60d4a80809", "scanner": "scanner-primary", "fingerprint": "c73d15bebea7a2b2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-64ece6676d8c3436", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/learn/page.tsx:72"}, "properties": {"repobilityId": "2540e9f7497ba228", "scanner": "scanner-primary", "fingerprint": "64ece6676d8c3436", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c9f1474839fc5e80", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-mcp-servers/page.tsx:151"}, "properties": {"repobilityId": "4247b3b473a4682b", "scanner": "scanner-primary", "fingerprint": "c9f1474839fc5e80", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2e0c61aadfa4f965", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-cheat-sheet/page.tsx:115"}, "properties": {"repobilityId": "deabe0035acf896b", "scanner": "scanner-primary", "fingerprint": "2e0c61aadfa4f965", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-174ea673c681d9c0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-api-tutorial/page.tsx:132"}, "properties": {"repobilityId": "91d795f2042aace4", "scanner": "scanner-primary", "fingerprint": "174ea673c681d9c0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b5c971ac310fd6db", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-developers/page.tsx:148"}, "properties": {"repobilityId": "136733c60130de49", "scanner": "scanner-primary", "fingerprint": "b5c971ac310fd6db", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4cfe88d4e23dd216", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-automation/page.tsx:142"}, "properties": {"repobilityId": "0b39559e878a638d", "scanner": "scanner-primary", "fingerprint": "4cfe88d4e23dd216", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-953dbb377297c81c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-extended-thinking/page.tsx:155"}, "properties": {"repobilityId": "409757487f62f114", "scanner": "scanner-primary", "fingerprint": "953dbb377297c81c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-be3f3530b44c2c85", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/learn-ai/page.tsx:140"}, "properties": {"repobilityId": "40bf6094dbd519ab", "scanner": "scanner-primary", "fingerprint": "be3f3530b44c2c85", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8650ba7fbae4663c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-tutorial/page.tsx:210"}, "properties": {"repobilityId": "47d74e3956978fa2", "scanner": "scanner-primary", "fingerprint": "8650ba7fbae4663c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8f96b557bc7c9cf0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-api-tutorial/page.tsx:130"}, "properties": {"repobilityId": "b9210cd986955575", "scanner": "scanner-primary", "fingerprint": "8f96b557bc7c9cf0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-31755caadfa59b20", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-prompts/page.tsx:137"}, "properties": {"repobilityId": "1b05d27aaa1c1160", "scanner": "scanner-primary", "fingerprint": "31755caadfa59b20", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7f9f9f85d177f840", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-tool-use/page.tsx:165"}, "properties": {"repobilityId": "5d88f2ba86fe2c3b", "scanner": "scanner-primary", "fingerprint": "7f9f9f85d177f840", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b980246ab6f500f2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/what-is-claude/page.tsx:170"}, "properties": {"repobilityId": "5525ba62bd6240d4", "scanner": "scanner-primary", "fingerprint": "b980246ab6f500f2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0bd24df48ddd7566", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-certification/page.tsx:136"}, "properties": {"repobilityId": "1eecf8c0557c5e1c", "scanner": "scanner-primary", "fingerprint": "0bd24df48ddd7566", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-33b8d805b955fdce", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-pair-programming/page.tsx:138"}, "properties": {"repobilityId": "304aef978b2f7a47", "scanner": "scanner-primary", "fingerprint": "33b8d805b955fdce", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8c429770bc8d75e9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/best-claude-prompts/page.tsx:235"}, "properties": {"repobilityId": "b9d32e3884b4f737", "scanner": "scanner-primary", "fingerprint": "8c429770bc8d75e9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-cf5ca64b8b984f41", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-for-python/page.tsx:125"}, "properties": {"repobilityId": "fc838946682f5b9a", "scanner": "scanner-primary", "fingerprint": "cf5ca64b8b984f41", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-30801eab3b23ebcb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-batch-api/page.tsx:171"}, "properties": {"repobilityId": "c7320ee80b51a0ab", "scanner": "scanner-primary", "fingerprint": "30801eab3b23ebcb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e3ae2168d616ef5d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-marketing/page.tsx:144"}, "properties": {"repobilityId": "9f7745e8e79bdf81", "scanner": "scanner-primary", "fingerprint": "e3ae2168d616ef5d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4dbbb305b6d9674e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/custom-gpts-tutorial/page.tsx:136"}, "properties": {"repobilityId": "cda3099fb7356ee1", "scanner": "scanner-primary", "fingerprint": "4dbbb305b6d9674e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-73d2ca1d79709e92", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-projects/page.tsx:109"}, "properties": {"repobilityId": "e40bbd7d49072729", "scanner": "scanner-primary", "fingerprint": "73d2ca1d79709e92", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8f44710ff19aee23", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/[locale]/claude-memory/page.tsx:281"}, "properties": {"repobilityId": "29ab9f63e546686c", "scanner": "scanner-primary", "fingerprint": "8f44710ff19aee23", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-92b3420929bf2f93", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-memory/page.tsx:109"}, "properties": {"repobilityId": "05162e8e8a02594d", "scanner": "scanner-primary", "fingerprint": "92b3420929bf2f93", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b098e30d85becd58", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-vs-copilot/page.tsx:154"}, "properties": {"repobilityId": "54b0c464e9227929", "scanner": "scanner-primary", "fingerprint": "b098e30d85becd58", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1290e0b77a4a9dab", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-slash-commands/page.tsx:130"}, "properties": {"repobilityId": "99e8d6ad2e5ba45c", "scanner": "scanner-primary", "fingerprint": "1290e0b77a4a9dab", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5ff947960afdb4b5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/getting-started/page.tsx:74"}, "properties": {"repobilityId": "375fabf2449d2aa3", "scanner": "scanner-primary", "fingerprint": "5ff947960afdb4b5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b0d000d0f535870d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-system-prompts/page.tsx:196"}, "properties": {"repobilityId": "71e8e6d63bd322bd", "scanner": "scanner-primary", "fingerprint": "b0d000d0f535870d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-05e83a41bbaba079", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-vs-cursor/page.tsx:167"}, "properties": {"repobilityId": "634cc6b93b967eb5", "scanner": "scanner-primary", "fingerprint": "05e83a41bbaba079", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-25801ed633f53c53", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/is-claude-free/page.tsx:129"}, "properties": {"repobilityId": "7076227d50643843", "scanner": "scanner-primary", "fingerprint": "25801ed633f53c53", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9c8364e4963e28c4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-business/page.tsx:199"}, "properties": {"repobilityId": "75785307bd30a06d", "scanner": "scanner-primary", "fingerprint": "9c8364e4963e28c4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0d7c581b531ab792", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-sonnet-vs-opus/page.tsx:153"}, "properties": {"repobilityId": "b59c353b2b2947f3", "scanner": "scanner-primary", "fingerprint": "0d7c581b531ab792", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e374085e1529a21a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-for-beginners/page.tsx:104"}, "properties": {"repobilityId": "68b27d168fdf28ab", "scanner": "scanner-primary", "fingerprint": "e374085e1529a21a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-04bc7f2b608084f4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-tips/page.tsx:140"}, "properties": {"repobilityId": "de8c8af558bdc450", "scanner": "scanner-primary", "fingerprint": "04bc7f2b608084f4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9acfe373f7e38bf4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-debugging/page.tsx:125"}, "properties": {"repobilityId": "a40636d0749a34bd", "scanner": "scanner-primary", "fingerprint": "9acfe373f7e38bf4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3237df999c9b7ce3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/for-teams/page.tsx:72"}, "properties": {"repobilityId": "444b06cd036fe531", "scanner": "scanner-primary", "fingerprint": "3237df999c9b7ce3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e201d6b70a28360e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-training/page.tsx:115"}, "properties": {"repobilityId": "adff81da5027dd0a", "scanner": "scanner-primary", "fingerprint": "e201d6b70a28360e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b11c24436fdfba4f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/certification/page.tsx:72"}, "properties": {"repobilityId": "e019b9d18befa170", "scanner": "scanner-primary", "fingerprint": "b11c24436fdfba4f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9029e12d94fadc54", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-security/page.tsx:163"}, "properties": {"repobilityId": "75485a22c1c87930", "scanner": "scanner-primary", "fingerprint": "9029e12d94fadc54", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1ec8ecb062733c07", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(app)/projects/[slug]/ProjectShellClient.tsx:337"}, "properties": {"repobilityId": "1492cc15f0b1c512", "scanner": "scanner-primary", "fingerprint": "1ec8ecb062733c07", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61a2ee85c51cb2f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(app)/courses/[slug]/page.tsx:459"}, "properties": {"repobilityId": "e17b8fee010cfd99", "scanner": "scanner-primary", "fingerprint": "61a2ee85c51cb2f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce08e95d714d4099", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/learn-chatgpt/page.tsx:112"}, "properties": {"repobilityId": "49d9db5790a08d91", "scanner": "scanner-primary", "fingerprint": "ce08e95d714d4099", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fe7dad61d58a42e9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-vs-chatgpt/page.tsx:154"}, "properties": {"repobilityId": "b4942a11585c7b6b", "scanner": "scanner-primary", "fingerprint": "fe7dad61d58a42e9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-54b9f33ee54f64f8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-artifacts/page.tsx:147"}, "properties": {"repobilityId": "5bc12d6efe349494", "scanner": "scanner-primary", "fingerprint": "54b9f33ee54f64f8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1e238149fd97727a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/curriculum/page.tsx:176"}, "properties": {"repobilityId": "952889968bca643d", "scanner": "scanner-primary", "fingerprint": "1e238149fd97727a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-eeb9e3f9f62a1570", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-projects/page.tsx:119"}, "properties": {"repobilityId": "9a41617d82eca98e", "scanner": "scanner-primary", "fingerprint": "eeb9e3f9f62a1570", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a2204fe487f82bd0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-vs-gemini/page.tsx:157"}, "properties": {"repobilityId": "973c079f33f40c32", "scanner": "scanner-primary", "fingerprint": "a2204fe487f82bd0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8e7db3bc0f1a03ea", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-non-programmers/page.tsx:168"}, "properties": {"repobilityId": "0c023c9b3c33bcc7", "scanner": "scanner-primary", "fingerprint": "8e7db3bc0f1a03ea", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-906f01f0267f5647", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/prompt-engineering/page.tsx:85"}, "properties": {"repobilityId": "a5973f5d0fe4cad2", "scanner": "scanner-primary", "fingerprint": "906f01f0267f5647", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f108d7659809d244", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-for-writers/page.tsx:158"}, "properties": {"repobilityId": "59d9488a2dbcb24c", "scanner": "scanner-primary", "fingerprint": "f108d7659809d244", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ec73bd65af4ddfdd", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code/page.tsx:85"}, "properties": {"repobilityId": "b47903b5ff7d3ae3", "scanner": "scanner-primary", "fingerprint": "ec73bd65af4ddfdd", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a5230e42ec978172", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-hooks/page.tsx:181"}, "properties": {"repobilityId": "ebcc8e0ab5be2611", "scanner": "scanner-primary", "fingerprint": "a5230e42ec978172", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9fdbb33c863b453f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/ai-for-beginners/page.tsx:141"}, "properties": {"repobilityId": "1386f979b20a8f9e", "scanner": "scanner-primary", "fingerprint": "9fdbb33c863b453f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fdd070a6a549157d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-multi-agent/page.tsx:137"}, "properties": {"repobilityId": "050f85087b09dbbf", "scanner": "scanner-primary", "fingerprint": "fdd070a6a549157d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f71d6a45251e8189", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-tdd/page.tsx:125"}, "properties": {"repobilityId": "d17df386d5258041", "scanner": "scanner-primary", "fingerprint": "f71d6a45251e8189", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-344bf6400f2284ef", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-context-window/page.tsx:154"}, "properties": {"repobilityId": "62602046647615c0", "scanner": "scanner-primary", "fingerprint": "344bf6400f2284ef", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-24fd7264ef1ddb16", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-tutorial/page.tsx:131"}, "properties": {"repobilityId": "d56279b8907a6345", "scanner": "scanner-primary", "fingerprint": "24fd7264ef1ddb16", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0a3508a8f271c94c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/how-to-use-chatgpt/page.tsx:104"}, "properties": {"repobilityId": "449c3df0ad11e285", "scanner": "scanner-primary", "fingerprint": "0a3508a8f271c94c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-787df8a320817cb5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/chatgpt-vs-claude/page.tsx:152"}, "properties": {"repobilityId": "7302bc7b552eb538", "scanner": "scanner-primary", "fingerprint": "787df8a320817cb5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-763fa27a7b284e7f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/claude-code-setup/page.tsx:130"}, "properties": {"repobilityId": "dfb3ade355d16fa5", "scanner": "scanner-primary", "fingerprint": "763fa27a7b284e7f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2cc23c12468c4f42", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/slack-signups.ts:40"}, "properties": {"repobilityId": "613116a058eb61c6", "scanner": "scanner-primary", "fingerprint": "2cc23c12468c4f42", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb95a869aa38cdc4", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in content/seed/archive/track4-api-agents.json:437"}, "properties": {"repobilityId": "4ce083dee208da09", "scanner": "scanner-primary", "fingerprint": "bb95a869aa38cdc4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "content/seed/archive/track4-api-agents.json"}, "region": {"startLine": 437}}}]}, {"ruleId": "scanner-994ae82a97776805", "level": "error", "message": {"text": "Possible secret in content/seed/archive/track3-claude-code.json"}, "properties": {"repobilityId": "bc0398536c26f455", "scanner": "scanner-primary", "fingerprint": "994ae82a97776805", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "content/seed/archive/track3-claude-code.json"}, "region": {"startLine": 2076}}}]}, {"ruleId": "scanner-76820f9ccc26136a", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in content/seed/archive/track3-claude-code.json:1364"}, "properties": {"repobilityId": "c00e12a224573c30", "scanner": "scanner-primary", "fingerprint": "76820f9ccc26136a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "content/seed/archive/track3-claude-code.json"}, "region": {"startLine": 1364}}}]}, {"ruleId": "scanner-ec0b9fff7f3c189d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/LessonJsonLd.tsx:53"}, "properties": {"repobilityId": "e7b2af8de286a871", "scanner": "scanner-primary", "fingerprint": "ec0b9fff7f3c189d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/LessonJsonLd.tsx"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-4b3d487d37fd3d7f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/FaqJsonLd.tsx:41"}, "properties": {"repobilityId": "e18c342033c68692", "scanner": "scanner-primary", "fingerprint": "4b3d487d37fd3d7f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/FaqJsonLd.tsx"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-55e896f9049afabe", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/CourseJsonLd.tsx:51"}, "properties": {"repobilityId": "fe9534ccf8e2fff0", "scanner": "scanner-primary", "fingerprint": "55e896f9049afabe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/CourseJsonLd.tsx"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-b4dbb76b5ff29c11", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/BreadcrumbJsonLd.tsx:31"}, "properties": {"repobilityId": "c6d1562c93bec1bc", "scanner": "scanner-primary", "fingerprint": "b4dbb76b5ff29c11", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/BreadcrumbJsonLd.tsx"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-ece16fe8403ac33d", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/components/CompletionCertificate.tsx:56"}, "properties": {"repobilityId": "c88341f997904e71", "scanner": "scanner-primary", "fingerprint": "ece16fe8403ac33d", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/CompletionCertificate.tsx"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-b2c90d02448aa4db", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/page.tsx:91"}, "properties": {"repobilityId": "dd4f0510c05c7dc4", "scanner": "scanner-primary", "fingerprint": "b2c90d02448aa4db", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/page.tsx"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-d621ba053d932c4e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/layout.tsx:128"}, "properties": {"repobilityId": "6221240d83c49cf6", "scanner": "scanner-primary", "fingerprint": "d621ba053d932c4e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/layout.tsx"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-7988694c8ca66baf", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-for-business/page.tsx:138"}, "properties": {"repobilityId": "d6ebc01a41adb1de", "scanner": "scanner-primary", "fingerprint": "7988694c8ca66baf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/chatgpt-for-business/page.tsx"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-d1a7078c4f5e9b26", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-agents/page.tsx:138"}, "properties": {"repobilityId": "cba4f3be11deca50", "scanner": "scanner-primary", "fingerprint": "d1a7078c4f5e9b26", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-agents/page.tsx"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-00447b23339bb25c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-data-analysis/page.tsx:196"}, "properties": {"repobilityId": "06896b6fffa51e27", "scanner": "scanner-primary", "fingerprint": "00447b23339bb25c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-for-data-analysis/page.tsx"}, "region": {"startLine": 196}}}]}, {"ruleId": "scanner-ed5b7068f018d407", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/learn/page.tsx:72"}, "properties": {"repobilityId": "e8922f66c6f99314", "scanner": "scanner-primary", "fingerprint": "ed5b7068f018d407", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/learn/page.tsx"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-d3b5678018a96f0a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-mcp-servers/page.tsx:151"}, "properties": {"repobilityId": "1e45c7aaa40ee253", "scanner": "scanner-primary", "fingerprint": "d3b5678018a96f0a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-mcp-servers/page.tsx"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-e28d6f7a5be81c3a", "level": "warning", "message": {"text": "Insecure pattern 'subprocess_shell_true' in src/app/[locale]/claude-code-cheat-sheet/page.tsx:85"}, "properties": {"repobilityId": "edf925a2f226b8f0", "scanner": "scanner-primary", "fingerprint": "e28d6f7a5be81c3a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "subprocess_shell_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-cheat-sheet/page.tsx"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-c217de7e99864c70", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-cheat-sheet/page.tsx:115"}, "properties": {"repobilityId": "e50d35ef587294c9", "scanner": "scanner-primary", "fingerprint": "c217de7e99864c70", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-cheat-sheet/page.tsx"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-43180b1dc10dfc17", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-api-tutorial/page.tsx:132"}, "properties": {"repobilityId": "021f0cc0ca0a94eb", "scanner": "scanner-primary", "fingerprint": "43180b1dc10dfc17", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-api-tutorial/page.tsx"}, "region": {"startLine": 132}}}]}, {"ruleId": "scanner-cd548d1788f818b0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-developers/page.tsx:148"}, "properties": {"repobilityId": "f49abb0321d8ec7c", "scanner": "scanner-primary", "fingerprint": "cd548d1788f818b0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-for-developers/page.tsx"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-19b9b216f26dcdf3", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-automation/page.tsx:142"}, "properties": {"repobilityId": "09c8f158847d14e4", "scanner": "scanner-primary", "fingerprint": "19b9b216f26dcdf3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/ai-automation/page.tsx"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-b14b2e81b77293f5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-extended-thinking/page.tsx:155"}, "properties": {"repobilityId": "c087dbfa8869cabc", "scanner": "scanner-primary", "fingerprint": "b14b2e81b77293f5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-extended-thinking/page.tsx"}, "region": {"startLine": 155}}}]}, {"ruleId": "scanner-572f8d5929e01e1f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/learn-ai/page.tsx:140"}, "properties": {"repobilityId": "31facc0e2d82f644", "scanner": "scanner-primary", "fingerprint": "572f8d5929e01e1f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/learn-ai/page.tsx"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-9c7f472cc8036aa2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-tutorial/page.tsx:210"}, "properties": {"repobilityId": "17ba40bb3413d5c8", "scanner": "scanner-primary", "fingerprint": "9c7f472cc8036aa2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-tutorial/page.tsx"}, "region": {"startLine": 210}}}]}, {"ruleId": "scanner-6f00b9d13511ad14", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-api-tutorial/page.tsx:130"}, "properties": {"repobilityId": "a9919c6f6cb852ac", "scanner": "scanner-primary", "fingerprint": "6f00b9d13511ad14", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/chatgpt-api-tutorial/page.tsx"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-d5d41d2dfe5c646a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-prompts/page.tsx:137"}, "properties": {"repobilityId": "9d1f83ccbad02753", "scanner": "scanner-primary", "fingerprint": "d5d41d2dfe5c646a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/chatgpt-prompts/page.tsx"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-5027604bc49b5cfb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-tool-use/page.tsx:165"}, "properties": {"repobilityId": "ecda66987a15870b", "scanner": "scanner-primary", "fingerprint": "5027604bc49b5cfb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-tool-use/page.tsx"}, "region": {"startLine": 165}}}]}, {"ruleId": "scanner-eb69e400a19e4ec1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/what-is-claude/page.tsx:170"}, "properties": {"repobilityId": "38724c4dacd4a836", "scanner": "scanner-primary", "fingerprint": "eb69e400a19e4ec1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/what-is-claude/page.tsx"}, "region": {"startLine": 170}}}]}, {"ruleId": "scanner-6411e79609ad6a10", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-certification/page.tsx:136"}, "properties": {"repobilityId": "6c202a4cdab537b6", "scanner": "scanner-primary", "fingerprint": "6411e79609ad6a10", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/ai-certification/page.tsx"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-0580a0fac17df472", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-pair-programming/page.tsx:138"}, "properties": {"repobilityId": "c7da8ba1741ec2cd", "scanner": "scanner-primary", "fingerprint": "0580a0fac17df472", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/ai-pair-programming/page.tsx"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-0793ea19aee921d9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/best-claude-prompts/page.tsx:235"}, "properties": {"repobilityId": "4efa2bdf417e6960", "scanner": "scanner-primary", "fingerprint": "0793ea19aee921d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/best-claude-prompts/page.tsx"}, "region": {"startLine": 235}}}]}, {"ruleId": "scanner-b56e2de92138a48e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-for-python/page.tsx:125"}, "properties": {"repobilityId": "e2b49744c053a327", "scanner": "scanner-primary", "fingerprint": "b56e2de92138a48e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-for-python/page.tsx"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-afcc216de83044a7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-batch-api/page.tsx:171"}, "properties": {"repobilityId": "e8d31f0ae9b630a9", "scanner": "scanner-primary", "fingerprint": "afcc216de83044a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-batch-api/page.tsx"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-b3b61eb0c24ac88c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-marketing/page.tsx:144"}, "properties": {"repobilityId": "93525129156305a0", "scanner": "scanner-primary", "fingerprint": "b3b61eb0c24ac88c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-for-marketing/page.tsx"}, "region": {"startLine": 144}}}]}, {"ruleId": "scanner-6ef929dbbf411c8e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/custom-gpts-tutorial/page.tsx:136"}, "properties": {"repobilityId": "180918394741a37f", "scanner": "scanner-primary", "fingerprint": "6ef929dbbf411c8e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/custom-gpts-tutorial/page.tsx"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-3d6c94144662a3af", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-projects/page.tsx:109"}, "properties": {"repobilityId": "9b72dbebd0dfc246", "scanner": "scanner-primary", "fingerprint": "3d6c94144662a3af", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-projects/page.tsx"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-98974d1f5b9977cc", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-memory/page.tsx:109"}, "properties": {"repobilityId": "4364d3f29f49f71f", "scanner": "scanner-primary", "fingerprint": "98974d1f5b9977cc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-memory/page.tsx"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-07b843c224a211fe", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-vs-copilot/page.tsx:154"}, "properties": {"repobilityId": "c9084868d9af8f34", "scanner": "scanner-primary", "fingerprint": "07b843c224a211fe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-vs-copilot/page.tsx"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-f9f92d6b14b6ba77", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-slash-commands/page.tsx:130"}, "properties": {"repobilityId": "1920c1ed8a3c9d1a", "scanner": "scanner-primary", "fingerprint": "f9f92d6b14b6ba77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-slash-commands/page.tsx"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-02bad7c1d8b6b0ec", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/getting-started/page.tsx:74"}, "properties": {"repobilityId": "abb664f12c0ee77c", "scanner": "scanner-primary", "fingerprint": "02bad7c1d8b6b0ec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/getting-started/page.tsx"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-c10a00573b25dfef", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-system-prompts/page.tsx:196"}, "properties": {"repobilityId": "cb8266302b76a7da", "scanner": "scanner-primary", "fingerprint": "c10a00573b25dfef", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-system-prompts/page.tsx"}, "region": {"startLine": 196}}}]}, {"ruleId": "scanner-6ebdff00a19ef7fe", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-vs-cursor/page.tsx:167"}, "properties": {"repobilityId": "b948e1cee1ac51e5", "scanner": "scanner-primary", "fingerprint": "6ebdff00a19ef7fe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-vs-cursor/page.tsx"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-90eb3c77b560b296", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/is-claude-free/page.tsx:129"}, "properties": {"repobilityId": "c8ca57f55b936cf7", "scanner": "scanner-primary", "fingerprint": "90eb3c77b560b296", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/is-claude-free/page.tsx"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-8088193bcd3a5dce", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-business/page.tsx:199"}, "properties": {"repobilityId": "bb78b4da050b4dbe", "scanner": "scanner-primary", "fingerprint": "8088193bcd3a5dce", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-for-business/page.tsx"}, "region": {"startLine": 199}}}]}, {"ruleId": "scanner-6ba970d75608d5ff", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-sonnet-vs-opus/page.tsx:153"}, "properties": {"repobilityId": "c1c78c38dd324f3b", "scanner": "scanner-primary", "fingerprint": "6ba970d75608d5ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-sonnet-vs-opus/page.tsx"}, "region": {"startLine": 153}}}]}, {"ruleId": "scanner-44dd2a7ed391dbc1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-for-beginners/page.tsx:104"}, "properties": {"repobilityId": "a78478dd72099ead", "scanner": "scanner-primary", "fingerprint": "44dd2a7ed391dbc1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/chatgpt-for-beginners/page.tsx"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-94184ab5b8bcc8d6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-tips/page.tsx:140"}, "properties": {"repobilityId": "c1c81e65f394beec", "scanner": "scanner-primary", "fingerprint": "94184ab5b8bcc8d6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/chatgpt-tips/page.tsx"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-6909a6a371f86526", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-debugging/page.tsx:125"}, "properties": {"repobilityId": "c2c1bd19321b507f", "scanner": "scanner-primary", "fingerprint": "6909a6a371f86526", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-debugging/page.tsx"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-5a14820682f0d426", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/for-teams/page.tsx:72"}, "properties": {"repobilityId": "942a204814293ca6", "scanner": "scanner-primary", "fingerprint": "5a14820682f0d426", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/for-teams/page.tsx"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-5e8c98a660389df0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-training/page.tsx:115"}, "properties": {"repobilityId": "c3290205bbf7869f", "scanner": "scanner-primary", "fingerprint": "5e8c98a660389df0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/ai-training/page.tsx"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-302872ee5dc58d77", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/certification/page.tsx:72"}, "properties": {"repobilityId": "11592b43b9ef46b3", "scanner": "scanner-primary", "fingerprint": "302872ee5dc58d77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/certification/page.tsx"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-23c50e76df3ce6c5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-security/page.tsx:163"}, "properties": {"repobilityId": "ce524714aa760117", "scanner": "scanner-primary", "fingerprint": "23c50e76df3ce6c5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-security/page.tsx"}, "region": {"startLine": 163}}}]}, {"ruleId": "scanner-2c9ecfccc728d5bb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/learn-chatgpt/page.tsx:112"}, "properties": {"repobilityId": "bbd42e059fac7e17", "scanner": "scanner-primary", "fingerprint": "2c9ecfccc728d5bb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/learn-chatgpt/page.tsx"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-4823d50d2f45d523", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-vs-chatgpt/page.tsx:154"}, "properties": {"repobilityId": "c2652a7364160262", "scanner": "scanner-primary", "fingerprint": "4823d50d2f45d523", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-vs-chatgpt/page.tsx"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-8de91ad0ff09ea5f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-artifacts/page.tsx:147"}, "properties": {"repobilityId": "5f64b63edb5644b3", "scanner": "scanner-primary", "fingerprint": "8de91ad0ff09ea5f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-artifacts/page.tsx"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-dd18e3fce35cda64", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/curriculum/page.tsx:176"}, "properties": {"repobilityId": "30a2364aee1de24d", "scanner": "scanner-primary", "fingerprint": "dd18e3fce35cda64", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/curriculum/page.tsx"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-ba86fb02edc55d79", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-projects/page.tsx:119"}, "properties": {"repobilityId": "fea21759339d2671", "scanner": "scanner-primary", "fingerprint": "ba86fb02edc55d79", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-projects/page.tsx"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-5952c6ea0b3a5581", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-vs-gemini/page.tsx:157"}, "properties": {"repobilityId": "92c7b2528f13afff", "scanner": "scanner-primary", "fingerprint": "5952c6ea0b3a5581", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-vs-gemini/page.tsx"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-5a2362e7d89aef6c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-non-programmers/page.tsx:168"}, "properties": {"repobilityId": "e9a898c3aa94ad66", "scanner": "scanner-primary", "fingerprint": "5a2362e7d89aef6c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-for-non-programmers/page.tsx"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-0bf1f778d7f38589", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/prompt-engineering/page.tsx:85"}, "properties": {"repobilityId": "920be66b31c602fd", "scanner": "scanner-primary", "fingerprint": "0bf1f778d7f38589", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/prompt-engineering/page.tsx"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-8d731005ee277614", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-for-writers/page.tsx:158"}, "properties": {"repobilityId": "22c2a3c39a71f396", "scanner": "scanner-primary", "fingerprint": "8d731005ee277614", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-for-writers/page.tsx"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-79ed660c82337136", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code/page.tsx:85"}, "properties": {"repobilityId": "7307afeff96661e7", "scanner": "scanner-primary", "fingerprint": "79ed660c82337136", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code/page.tsx"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-3bc745cb26169b76", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-hooks/page.tsx:181"}, "properties": {"repobilityId": "b923fff62712443b", "scanner": "scanner-primary", "fingerprint": "3bc745cb26169b76", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-hooks/page.tsx"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-c69488fff57813eb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/ai-for-beginners/page.tsx:141"}, "properties": {"repobilityId": "ff0137cffb1e99da", "scanner": "scanner-primary", "fingerprint": "c69488fff57813eb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/ai-for-beginners/page.tsx"}, "region": {"startLine": 141}}}]}, {"ruleId": "scanner-bdc389dabce3537a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-multi-agent/page.tsx:137"}, "properties": {"repobilityId": "e39ad1cf24027a2d", "scanner": "scanner-primary", "fingerprint": "bdc389dabce3537a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-multi-agent/page.tsx"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-d3907a57718d9dc5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-tdd/page.tsx:125"}, "properties": {"repobilityId": "b7c25746aef95692", "scanner": "scanner-primary", "fingerprint": "d3907a57718d9dc5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-tdd/page.tsx"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-e27e6337fd745857", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-context-window/page.tsx:154"}, "properties": {"repobilityId": "af20c100ff47821c", "scanner": "scanner-primary", "fingerprint": "e27e6337fd745857", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-context-window/page.tsx"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-a277249c4014439d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-tutorial/page.tsx:131"}, "properties": {"repobilityId": "b9cbb3b54878f7be", "scanner": "scanner-primary", "fingerprint": "a277249c4014439d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/chatgpt-tutorial/page.tsx"}, "region": {"startLine": 131}}}]}, {"ruleId": "scanner-195e4344cbef9cd8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/how-to-use-chatgpt/page.tsx:104"}, "properties": {"repobilityId": "8709244f630f741e", "scanner": "scanner-primary", "fingerprint": "195e4344cbef9cd8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/how-to-use-chatgpt/page.tsx"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-a38fba2ad325e17c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/chatgpt-vs-claude/page.tsx:152"}, "properties": {"repobilityId": "c7df372cb0dbaa42", "scanner": "scanner-primary", "fingerprint": "a38fba2ad325e17c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/chatgpt-vs-claude/page.tsx"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-a3a62ee77ad29cd2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/claude-code-setup/page.tsx:130"}, "properties": {"repobilityId": "0eef9f621c53806f", "scanner": "scanner-primary", "fingerprint": "a3a62ee77ad29cd2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/claude-code-setup/page.tsx"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "65d58d2a7545bf6a", "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": "ef856b67410bfe8c", "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": "22377d6c63a45aeb", "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": "40f5cfb34c36f78a", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "ff1ceb220034432f", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "ade3ad5c7cd2fa87", "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": "3beb64c6b403da2a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-caeaa3018fa893c8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ping-indexnow.ts:21"}, "properties": {"repobilityId": "5167278a14121f5a", "scanner": "scanner-primary", "fingerprint": "caeaa3018fa893c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0b9cf7ffe4790fc", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/reseed-course.ts:24"}, "properties": {"repobilityId": "ac0c863aee5268fe", "scanner": "scanner-primary", "fingerprint": "e0b9cf7ffe4790fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf790dc40a44dc14", "level": "note", "message": {"text": "Legacy-named symbol `sa_v1` in src/proxy.ts:144"}, "properties": {"repobilityId": "3b854b21adf09cb8", "scanner": "scanner-primary", "fingerprint": "cf790dc40a44dc14", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cb6f5762647bb896", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/proxy.ts:37"}, "properties": {"repobilityId": "cea20553d774eb46", "scanner": "scanner-primary", "fingerprint": "cb6f5762647bb896", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b04ebd9cbbf9fe90", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/i18n/routing.ts:20"}, "properties": {"repobilityId": "93f44c96bbcb6abf", "scanner": "scanner-primary", "fingerprint": "b04ebd9cbbf9fe90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af5283a8b3ea0ee2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/MidLessonSignupBar.tsx:10"}, "properties": {"repobilityId": "0395fe42246e70c3", "scanner": "scanner-primary", "fingerprint": "af5283a8b3ea0ee2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87bf270310da9cc3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/CheckoutStatusBanner.tsx:12"}, "properties": {"repobilityId": "6f45101a8561bcff", "scanner": "scanner-primary", "fingerprint": "87bf270310da9cc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8175a6931ab3e84d", "level": "none", "message": {"text": "Commented-code block (14 lines) in src/app/sitemap.ts:24"}, "properties": {"repobilityId": "2c832bd20f800734", "scanner": "scanner-primary", "fingerprint": "8175a6931ab3e84d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71c7ba10eeee110f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/daily-challenge/complete/route.ts:75"}, "properties": {"repobilityId": "f093d7f8cdd0ec44", "scanner": "scanner-primary", "fingerprint": "71c7ba10eeee110f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-277bf1a29bf35a3a", "level": "note", "message": {"text": "Legacy-named symbol `sa_v1` in src/app/api/auth/callback/route.ts:203"}, "properties": {"repobilityId": "375a0621bb48c911", "scanner": "scanner-primary", "fingerprint": "277bf1a29bf35a3a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9527199342d83ec4", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/auth/callback/route.ts:140"}, "properties": {"repobilityId": "cc020fea7b444beb", "scanner": "scanner-primary", "fingerprint": "9527199342d83ec4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef03be9d282f123d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exercises/check/route.ts:99"}, "properties": {"repobilityId": "46b1a1b37b650438", "scanner": "scanner-primary", "fingerprint": "ef03be9d282f123d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-076af1c1b0252921", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/projects/progress/route.ts:12"}, "properties": {"repobilityId": "f942c479a7f0ce4b", "scanner": "scanner-primary", "fingerprint": "076af1c1b0252921", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5973ba3f59858c64", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/cron/streak-reminder/route.ts:133"}, "properties": {"repobilityId": "cf91140b377f81be", "scanner": "scanner-primary", "fingerprint": "5973ba3f59858c64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf79aadab8168f7f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/checkout/route.ts:146"}, "properties": {"repobilityId": "9f0dc3e5f187314f", "scanner": "scanner-primary", "fingerprint": "bf79aadab8168f7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9abed5280d8f3c5d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/checkout/masterclass/route.ts:3"}, "properties": {"repobilityId": "70a6e8fe4dd69407", "scanner": "scanner-primary", "fingerprint": "9abed5280d8f3c5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c442bd18906732a", "level": "note", "message": {"text": "Legacy-named symbol `fromLegacy` in src/app/api/webhooks/stripe/route.ts:37"}, "properties": {"repobilityId": "d5841863fae11e87", "scanner": "scanner-primary", "fingerprint": "1c442bd18906732a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c81f3673f4a297e8", "level": "note", "message": {"text": "Legacy-named symbol `labelOld` in src/app/[locale]/page.tsx:242"}, "properties": {"repobilityId": "9bd22a251f628526", "scanner": "scanner-primary", "fingerprint": "c81f3673f4a297e8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-16724558405eb388", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/[locale]/layout.tsx:129"}, "properties": {"repobilityId": "043a7f6f7790472a", "scanner": "scanner-primary", "fingerprint": "16724558405eb388", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ab32c2b3d93b7344", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/[locale]/(app)/projects/[slug]/page.tsx:9"}, "properties": {"repobilityId": "4abbd8fdeb167a33", "scanner": "scanner-primary", "fingerprint": "ab32c2b3d93b7344", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a65f8ebf2f3155b9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/[locale]/(app)/projects/[slug]/ProjectShellClient.tsx:21"}, "properties": {"repobilityId": "3b92be8bb4679fc3", "scanner": "scanner-primary", "fingerprint": "a65f8ebf2f3155b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04f9b9fad01b9369", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/[locale]/(app)/courses/[slug]/[lesson]/LessonPlayerClient.tsx:37"}, "properties": {"repobilityId": "8dafc3fd2ef53122", "scanner": "scanner-primary", "fingerprint": "04f9b9fad01b9369", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d07614b6bd7d6fa8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/[locale]/(app)/courses/[slug]/[lesson]/LessonPlayerClient.tsx:39"}, "properties": {"repobilityId": "38d92e5abcafd7ae", "scanner": "scanner-primary", "fingerprint": "d07614b6bd7d6fa8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e705b35665bbdb5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/[locale]/masterclass/page.tsx:3"}, "properties": {"repobilityId": "a35c49178eac5ab9", "scanner": "scanner-primary", "fingerprint": "0e705b35665bbdb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67051643777e532d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/analytics.ts:6"}, "properties": {"repobilityId": "e7d79355ee491159", "scanner": "scanner-primary", "fingerprint": "67051643777e532d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9d9623c01528bdb1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/local-progress.ts:177"}, "properties": {"repobilityId": "10243164b4dea933", "scanner": "scanner-primary", "fingerprint": "9d9623c01528bdb1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-030da566069872e9", "level": "note", "message": {"text": "15 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "0519c1c0e8c1f8e4", "scanner": "scanner-primary", "fingerprint": "030da566069872e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}