{"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-c814cf98b8a680a2", "name": "TODO/FIXME marker in shipping code \u2014 src/proxy.ts:30", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/proxy.ts:30"}, "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-cdc0012e9ef2ae8d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:78", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:78"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e0c38c8ed4a69493", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/specials/[id]/edit/page.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/specials/[id]/edit/page.tsx:32"}, "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-0b257b43d56d283d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/books/arcs-overview.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/books/arcs-overview.tsx:122"}, "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-c8df6de536317d6c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/dashboard/page.tsx:368", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/dashboard/page.tsx:368"}, "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-2adb0ddda90c87c7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/series/page.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/series/page.tsx:209"}, "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-eca2403f74bcb628", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/newsletter/newsletter-client.tsx:242", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/newsletter/newsletter-client.tsx:242"}, "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-37695d04413d3210", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(admin)/admin/newsletter/newsletter-client.tsx:391", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(admin)/admin/newsletter/newsletter-client.tsx:391"}, "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-09400c2a0642c834", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/appearance/appearance-client.tsx:370", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/appearance/appearance-client.tsx:370"}, "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-03166f9f932b2f32", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/messages/messages-client.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/messages/messages-client.tsx:187"}, "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-cd9b59c82b8bd6fb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/analytics/page.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/analytics/page.tsx:30"}, "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-c68ddbaaa5fd4f58", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(admin)/admin/help/help-articles.tsx:28", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(admin)/admin/help/help-articles.tsx:28"}, "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-53378550460219df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/genres/page.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/genres/page.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-a939c2ee96aa862f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/flip-books/[id]/edit/page.tsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/flip-books/[id]/edit/page.tsx:31"}, "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-be1a3415eab0bf6e", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/expire-trials/route.ts:118", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/expire-trials/route.ts:118"}, "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-8019d516108c0a83", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/onboarding-cleanup/route.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/onboarding-cleanup/route.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-c6dabf120255b4f3", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/process-social-posts/route.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/process-social-posts/route.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-34717a4281b69568", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/reset-ai-usage/route.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/reset-ai-usage/route.ts:30"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-60206f7518b72b6c", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/cleanup-unverified/route.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/cleanup-unverified/route.ts:23"}, "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-e724e9c3df714a4d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/specials/page.tsx:114", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/specials/page.tsx:114"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-612e52b1f5129747", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/books/[slug]/page.tsx:194", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/books/[slug]/page.tsx:194"}, "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-313555d6b75b929a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/legal/page.tsx:107", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/legal/page.tsx:107"}, "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-a68c3871b47b7b84", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/about/page.tsx:153", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/about/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-e92d8f9777248657", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/series/[slug]/page.tsx:92", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/series/[slug]/page.tsx:92"}, "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-a3bb99299aaed4e2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/media-kit/page.tsx:147", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/media-kit/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-5a6891ff3211e5d5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/[pageSlug]/page.tsx:92", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/[pageSlug]/page.tsx:92"}, "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-add9887f629714ac", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/blog/[slug]/page.tsx:104", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/blog/[slug]/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-74fb8282973aed5a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/page.tsx:436", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/page.tsx:436"}, "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-70382bf67ce557ba", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/bookstore/page.tsx:105", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/bookstore/page.tsx:105"}, "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-27ac6ee498bfe76b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/bookstore/genre/[slug]/page.tsx:86", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/bookstore/genre/[slug]/page.tsx:86"}, "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-f04ba7eb0349dd99", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/faq/page.tsx:103", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/faq/page.tsx:103"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3187a99a102df5a5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/news/page.tsx:80", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/news/page.tsx:80"}, "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-cafd10264b9a1180", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/news/[slug]/page.tsx:125", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/news/[slug]/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-66d78e8d0e127aa4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/blog/[slug]/page.tsx:127", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/blog/[slug]/page.tsx:127"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9413d2a5fc0fec79", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(auth)/register/page.tsx:340", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(auth)/register/page.tsx:340"}, "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-171008e00da9ec72", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(super-admin)/super-admin/resources/resources-client.tsx:18", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(super-admin)/super-admin/resources/resources-client.tsx:184"}, "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-ff8fb23bd48d57b5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(super-admin)/super-admin/blog/[id]/edit/page.tsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(super-admin)/super-admin/blog/[id]/edit/page.tsx:24"}, "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-b2f51df28373b65e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/pages-list-client.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/pages-list-client.tsx:86"}, "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-8b17b4eae1f491e9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/post-form.tsx:405", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/post-form.tsx:405"}, "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-6d4a7c3dc40fd86a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/admin-shell.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/admin-shell.tsx:94"}, "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-68a0198a061867be", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/rich-text-editor.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/rich-text-editor.tsx:101"}, "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-a709639307ecd17b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/retailer-links.tsx:343", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/retailer-links.tsx:343"}, "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-8189711275f53fd8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/specials-list-client.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/specials-list-client.tsx:130"}, "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-7de2503a76cc0710", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/books/arc-tab.tsx:423", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/books/arc-tab.tsx:423"}, "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-0a183dd96847ede8", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/super-admin/support-emails-pa", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/super-admin/support-emails-panel.tsx:62"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-75206e9db571509a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/mass-email-panel.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/mass-email-panel.tsx:171"}, "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-0ca73521b592d522", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/social-links-panel.tsx:235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/social-links-panel.tsx:235"}, "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-8a927e601d425792", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/beta-mode-panel.tsx:380", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/beta-mode-panel.tsx:380"}, "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-b48da921af89bfe7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/blog-posts-client.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/blog-posts-client.tsx:172"}, "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-a852e53d4031856c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/platform-post-form.tsx:460", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/platform-post-form.tsx:460"}, "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-f473127dc55bfa7a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/super-admin/testimonials-panel.tsx:374", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/super-admin/testimonials-panel.tsx:374"}, "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-b61e99fbb03c256c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/help-centre-admin.tsx:403", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/help-centre-admin.tsx:403"}, "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-d49bfd48e5fbb368", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/super-admin/help-centre-admin.tsx:115", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/super-admin/help-centre-admin.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-f1244e2004a1e74f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/marketing/testimonial-card.tsx:33", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/marketing/testimonial-card.tsx:33"}, "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-8a7ae82032137bfd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/marketing/browser-mockup.tsx:20", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/marketing/browser-mockup.tsx:20"}, "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-90a47db9debf3818", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/marketing/faq-page-list.tsx:61", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/marketing/faq-page-list.tsx:61"}, "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-b05793661a718434", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/marketing/midnight-testimonials-section.tsx:49", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/marketing/midnight-testimonials-section.tsx:49"}, "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-e61d70a817558ded", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/book-overview.tsx:23", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/book-overview.tsx:23"}, "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-d82256765b71e491", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/book-carousel.tsx:243", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/book-carousel.tsx:243"}, "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-0736f9ee0ca2d314", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/cart-drawer.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/cart-drawer.tsx:213"}, "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-cf4687206109ef16", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/book-excerpt-modal.tsx:97", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/book-excerpt-modal.tsx:97"}, "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-df743868b6f28261", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/book-card.tsx:255", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/book-card.tsx:255"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e477e56d425e04fb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/templates/minimal.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/templates/minimal.tsx:43"}, "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-fd2e7d2731edde20", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/minimal.tsx:169", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/minimal.tsx:169"}, "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-7d5abdac816af0be", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/bold.tsx:49", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/bold.tsx:49"}, "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-e902d89671cc149c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/templates/classic.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/templates/classic.tsx:143"}, "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-5d62088e27ce39ac", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/classic.tsx:57", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/classic.tsx:57"}, "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-7740e41cfe2e9dea", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/cinematic.tsx:106", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/cinematic.tsx:106"}, "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-73b7dfecc78bed33", "name": "Stray `console.log` in TS/JS \u2014 src/lib/audit-logger.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/audit-logger.ts:27"}, "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-cb60a4dadc9ed81b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/sanitize.ts:4", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/sanitize.ts:4"}, "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-728fb6569dc52753", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-blog.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-blog.ts:89"}, "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-4a7b06cf9368b1d6", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-60bd2b2eb172365d", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:78", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:78"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12fbd83aaa27221f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(admin)/admin/newsletter/newsletter-client.tsx:391", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(admin)/admin/newsletter/newsletter-client.tsx:391"}, "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-4d90869998ef9366", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(admin)/admin/help/help-articles.tsx:28", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(admin)/admin/help/help-articles.tsx:28"}, "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-9a207d8095e39a51", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/specials/page.tsx:114", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/specials/page.tsx:114"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-07abbf86f41764fc", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/books/[slug]/page.tsx:194", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/books/[slug]/page.tsx:194"}, "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-12eb40fe7016e60e", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/legal/page.tsx:107", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/legal/page.tsx:107"}, "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-28d972f4281e97cc", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/about/page.tsx:153", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/about/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-2b89cde028136e94", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/series/[slug]/page.tsx:92", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/series/[slug]/page.tsx:92"}, "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-a7ad15070f77c915", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/media-kit/page.tsx:147", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/media-kit/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-1b60599e48576162", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/[pageSlug]/page.tsx:92", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/[pageSlug]/page.tsx:92"}, "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-b23c47e026e52269", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/blog/[slug]/page.tsx:104", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/blog/[slug]/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-8df489ed972e4b83", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/page.tsx:436", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/page.tsx:436"}, "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-52159f3eb5db9f0f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/bookstore/page.tsx:105", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/bookstore/page.tsx:105"}, "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-21d23800f16b6a53", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/bookstore/genre/[slug]/page.tsx:86", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/bookstore/genre/[slug]/page.tsx:86"}, "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-f1b4bae62dee0acc", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/faq/page.tsx:103", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/faq/page.tsx:103"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-03df5bf3194b4c76", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/news/page.tsx:80", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/news/page.tsx:80"}, "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-917b8c9790465518", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/news/[slug]/page.tsx:125", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/news/[slug]/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-42b960a277be2e97", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/blog/[slug]/page.tsx:127", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/blog/[slug]/page.tsx:127"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-647a801f093e4cc1", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/(auth)/register/page.tsx:340", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(auth)/register/page.tsx:340"}, "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-42221d9a52726766", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/super-admin/testimonials-panel.tsx:374", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/super-admin/testimonials-panel.tsx:374"}, "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-97ec03941dd6e86e", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/super-admin/help-centre-admin.tsx:115", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/super-admin/help-centre-admin.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-08780790cd04f324", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/marketing/testimonial-card.tsx:33", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/marketing/testimonial-card.tsx:33"}, "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-08b4ce096f7927b5", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/marketing/faq-page-list.tsx:61", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/marketing/faq-page-list.tsx:61"}, "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-b1f99bd155a1defb", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/marketing/midnight-testimonials-section.tsx:49", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/marketing/midnight-testimonials-section.tsx:49"}, "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-6d6f8ee421641b49", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/author-site/book-overview.tsx:23", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/author-site/book-overview.tsx:23"}, "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-d831e96ff8275800", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/author-site/book-excerpt-modal.tsx:97", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/author-site/book-excerpt-modal.tsx:97"}, "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-946fabe96e0d4a10", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/author-site/book-card.tsx:255", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/author-site/book-card.tsx:255"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3afa6426f8aebd4d", "name": "Insecure pattern 'weak_hash' in src/lib/social/twitter.ts:58", "shortDescription": {"text": "Insecure pattern 'weak_hash' in src/lib/social/twitter.ts:58"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "13 test file(s) for 546 source file(s) (ratio 0.02). 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 25 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 329 placeholder/mock markers across 83 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e7e1cde3733a54ce", "name": "Agent authority lacks a verifier contract: C\uf03aUsersandybDownloadsbookstage.claudelaunch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: C\uf03aUsersandybDownloadsbookstage.claudelaunch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71498d556c16a0ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/series/page.tsx:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/series/page.tsx:36"}, "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-868e6f52084cf922", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/newsletter/newsletter-integration-inner.tsx:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/newsletter/newsletter-integration-inner.tsx:47"}, "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-3bd904b4af0fe291", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/messages/messages-client.tsx:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/messages/messages-client.tsx:55"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-726dcb13dabf10bf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/discount-codes/page.tsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/discount-codes/page.tsx:81"}, "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-957299892cd45000", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/invoices/page.tsx:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/invoices/page.tsx:28"}, "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-a79163f7d339b693", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/genres/page.tsx:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/genres/page.tsx:47"}, "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-b3fd34ef1e5aaf27", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/admin/analytics/route.ts:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/admin/analytics/route.ts:14"}, "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-496d62c1711a1972", "name": "Commented-code block (5 lines) in src/app/api/super-admin/feature-config/route.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/super-admin/feature-config/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-c41d2b077e7256cc", "name": "Commented-code block (5 lines) in src/app/(author-site)/[domain]/layout.tsx:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/(author-site)/[domain]/layout.tsx:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cdbba8fea7721a88", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/resource-downloads/downloads-client.tsx:", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/resource-downloads/downloads-client.tsx:79"}, "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-7e70d5e4e4f05df6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/access-requests/AccessRequestsTable.tsx:", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/access-requests/AccessRequestsTable.tsx:23"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-181d08a8b79cd7fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/authors/[id]/author-edit-form.tsx:501", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/authors/[id]/author-edit-form.tsx:501"}, "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-c83deef268a9d69e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/resources/resources-client.tsx:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/resources/resources-client.tsx:77"}, "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-fe3c2c82e40cb7d4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/coupons/coupons-client.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/coupons/coupons-client.tsx:53"}, "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-1faed16e146823dc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/categories/categories-client.tsx:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/categories/categories-client.tsx:52"}, "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-f6c4ed924d9d1fe6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-csrf-token.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-csrf-token.ts:20"}, "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-9306827f0e9dd08a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/impersonation-banner.tsx:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/impersonation-banner.tsx:13"}, "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-1bdbe3e849b618f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/flip-book-form.tsx:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/flip-book-form.tsx:116"}, "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-507bccbac442316f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-preview-media.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-preview-media.tsx:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-18cf5ab6f1c000ec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-form.tsx:370", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-form.tsx:370"}, "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-47c484236386db90", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/special-form.tsx:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/special-form.tsx:62"}, "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-98d86a56552b770a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/onboarding-guided-modal.tsx:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/onboarding-guided-modal.tsx:116"}, "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-9e7b27cc5dab09d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/direct-sales-items.tsx:185", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/direct-sales-items.tsx:185"}, "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-f70ae0336a69f7d3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/preorder-signups.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/preorder-signups.tsx:24"}, "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-1c3fbde97a009db0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/next-steps-card.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/next-steps-card.tsx: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-77e50305391ca0d3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-reviews.tsx:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-reviews.tsx:80"}, "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-7a0c574abe33b2ba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/branding-form.tsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/branding-form.tsx:128"}, "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-20d15f156e1c595c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-audio-tracks.tsx:302", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-audio-tracks.tsx:302"}, "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-4e60ea046c691f27", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/affiliate-settings.tsx:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/affiliate-settings.tsx:35"}, "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-b6ad6ac4982019db", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/retailer-links.tsx:166", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/retailer-links.tsx:166"}, "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-f2a7b46e45f546c5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/books/arc-tab.tsx:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/books/arc-tab.tsx:132"}, "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-41bdadd96b77856c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/help-article-form.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/help-article-form.tsx:54"}, "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-6abe926cc97e64f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/support-emails-panel.tsx:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/support-emails-panel.tsx:40"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5c6d7a09a6336c84", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/plan-form.tsx:136", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/plan-form.tsx:136"}, "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-b82ac873942015ff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/social-post-form.tsx:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/social-post-form.tsx:116"}, "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-97d2dba9089ee33b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/plans-table.tsx:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/plans-table.tsx:61"}, "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-8671cc78825efcf0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/platform-post-form.tsx:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/platform-post-form.tsx:112"}, "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-0f79e7c1bc238dd5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/seo-panel.tsx:169", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/seo-panel.tsx:169"}, "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-eb61c3c7df305174", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/faqs-panel.tsx:160", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/faqs-panel.tsx:160"}, "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-3dfeea44b068963d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/testimonials-panel.tsx:195", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/testimonials-panel.tsx:195"}, "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-f6e16a35893d8479", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/help-centre-admin.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/help-centre-admin.tsx:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-23cda7aa63e70ca0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/email-integrations.ts:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/email-integrations.ts:16"}, "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-42237bcf5c3321cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/supabase-storage.ts:198", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/supabase-storage.ts:198"}, "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-902f685f060236cc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/linkedin.ts:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/linkedin.ts:82"}, "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-e6bec4b5b287f4eb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/facebook.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/facebook.ts:56"}, "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-9571d411c931e936", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/instagram.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/instagram.ts:75"}, "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-a960d4c94488b307", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/twitter.ts:131", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/twitter.ts:131"}, "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-b8823f3c1581a787", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/__tests__/security.test.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/__tests__/security.test.ts:27"}, "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-59b992d62d86a65a", "name": "25 env vars used in code but missing from .env.example", "shortDescription": {"text": "25 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BUILD_TIME`, `CRON_SECRET`, `ENCRYPTION_KEY`, `GEMINI_API_KEY`, `NEXT_PUBLIC_APP_URL`, `NEXT_PUBLIC_GOOGLE_ADS_ID`, `NEXT_PUBLIC_POSTHOG_HOST`, `NEXT_PUBLIC_POSTHOG_KEY` + 17 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/24197"}, "properties": {"repository": "andybedford62-AI/authorloft", "repoUrl": "https://github.com/andybedford62-AI/authorloft", "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-c814cf98b8a680a2", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/proxy.ts:30"}, "properties": {"repobilityId": "a4ba5448424617ac", "scanner": "scanner-primary", "fingerprint": "c814cf98b8a680a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-cdc0012e9ef2ae8d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:78"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "cdc0012e9ef2ae8d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e0c38c8ed4a69493", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/specials/[id]/edit/page.tsx:32"}, "properties": {"repobilityId": "475c06f0a49f7eaa", "scanner": "scanner-primary", "fingerprint": "e0c38c8ed4a69493", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b257b43d56d283d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/books/arcs-overview.tsx:122"}, "properties": {"repobilityId": "a3642d3c6657ed5a", "scanner": "scanner-primary", "fingerprint": "0b257b43d56d283d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8df6de536317d6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/dashboard/page.tsx:368"}, "properties": {"repobilityId": "4b9880795a92b590", "scanner": "scanner-primary", "fingerprint": "c8df6de536317d6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2adb0ddda90c87c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/series/page.tsx:209"}, "properties": {"repobilityId": "bb1cffa6c17db000", "scanner": "scanner-primary", "fingerprint": "2adb0ddda90c87c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eca2403f74bcb628", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/newsletter/newsletter-client.tsx:242"}, "properties": {"repobilityId": "69c86fecd38eece0", "scanner": "scanner-primary", "fingerprint": "eca2403f74bcb628", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37695d04413d3210", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(admin)/admin/newsletter/newsletter-client.tsx:391"}, "properties": {"repobilityId": "257dce5a6e5a5e0d", "scanner": "scanner-primary", "fingerprint": "37695d04413d3210", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-09400c2a0642c834", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/appearance/appearance-client.tsx:370"}, "properties": {"repobilityId": "541f5c404db5bd77", "scanner": "scanner-primary", "fingerprint": "09400c2a0642c834", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03166f9f932b2f32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/messages/messages-client.tsx:187"}, "properties": {"repobilityId": "ad8e736107d599fa", "scanner": "scanner-primary", "fingerprint": "03166f9f932b2f32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd9b59c82b8bd6fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/analytics/page.tsx:30"}, "properties": {"repobilityId": "68d49ffa054be62c", "scanner": "scanner-primary", "fingerprint": "cd9b59c82b8bd6fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c68ddbaaa5fd4f58", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(admin)/admin/help/help-articles.tsx:28"}, "properties": {"repobilityId": "9a9061301d8531ab", "scanner": "scanner-primary", "fingerprint": "c68ddbaaa5fd4f58", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-53378550460219df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/genres/page.tsx:99"}, "properties": {"repobilityId": "6f233581c251d8ed", "scanner": "scanner-primary", "fingerprint": "53378550460219df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a939c2ee96aa862f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/admin/flip-books/[id]/edit/page.tsx:31"}, "properties": {"repobilityId": "e00bd6b310fab22c", "scanner": "scanner-primary", "fingerprint": "a939c2ee96aa862f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be1a3415eab0bf6e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/expire-trials/route.ts:118"}, "properties": {"repobilityId": "30c8ac964afc5c3a", "scanner": "scanner-primary", "fingerprint": "be1a3415eab0bf6e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8019d516108c0a83", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/onboarding-cleanup/route.ts:92"}, "properties": {"repobilityId": "2c3c99aea04354cc", "scanner": "scanner-primary", "fingerprint": "8019d516108c0a83", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6dabf120255b4f3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/process-social-posts/route.ts:26"}, "properties": {"repobilityId": "27083fb65d641627", "scanner": "scanner-primary", "fingerprint": "c6dabf120255b4f3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-34717a4281b69568", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/reset-ai-usage/route.ts:30"}, "properties": {"repobilityId": "edf084d8a15015e9", "scanner": "scanner-primary", "fingerprint": "34717a4281b69568", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60206f7518b72b6c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/cleanup-unverified/route.ts:23"}, "properties": {"repobilityId": "7049d2453679d1b3", "scanner": "scanner-primary", "fingerprint": "60206f7518b72b6c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e724e9c3df714a4d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/specials/page.tsx:114"}, "properties": {"repobilityId": "576c25a76213e9d6", "scanner": "scanner-primary", "fingerprint": "e724e9c3df714a4d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-612e52b1f5129747", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/books/[slug]/page.tsx:194"}, "properties": {"repobilityId": "c1736dc9187ec5c8", "scanner": "scanner-primary", "fingerprint": "612e52b1f5129747", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-313555d6b75b929a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/legal/page.tsx:107"}, "properties": {"repobilityId": "9134abe84b53aa51", "scanner": "scanner-primary", "fingerprint": "313555d6b75b929a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a68c3871b47b7b84", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/about/page.tsx:153"}, "properties": {"repobilityId": "712a49ca60cf3a84", "scanner": "scanner-primary", "fingerprint": "a68c3871b47b7b84", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e92d8f9777248657", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/series/[slug]/page.tsx:92"}, "properties": {"repobilityId": "b30dd0ffb7f64d87", "scanner": "scanner-primary", "fingerprint": "e92d8f9777248657", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a3bb99299aaed4e2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/media-kit/page.tsx:147"}, "properties": {"repobilityId": "df6c281e3ac24d02", "scanner": "scanner-primary", "fingerprint": "a3bb99299aaed4e2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5a6891ff3211e5d5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/[pageSlug]/page.tsx:92"}, "properties": {"repobilityId": "3d7fa50bacd1afd6", "scanner": "scanner-primary", "fingerprint": "5a6891ff3211e5d5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-add9887f629714ac", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(author-site)/[domain]/blog/[slug]/page.tsx:104"}, "properties": {"repobilityId": "49af6f60727c9d58", "scanner": "scanner-primary", "fingerprint": "add9887f629714ac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-74fb8282973aed5a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/page.tsx:436"}, "properties": {"repobilityId": "3b9b79c882298b6e", "scanner": "scanner-primary", "fingerprint": "74fb8282973aed5a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-70382bf67ce557ba", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/bookstore/page.tsx:105"}, "properties": {"repobilityId": "5d8f35c439669ecc", "scanner": "scanner-primary", "fingerprint": "70382bf67ce557ba", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-27ac6ee498bfe76b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/bookstore/genre/[slug]/page.tsx:86"}, "properties": {"repobilityId": "9e03c1345f4f2ff0", "scanner": "scanner-primary", "fingerprint": "27ac6ee498bfe76b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f04ba7eb0349dd99", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/faq/page.tsx:103"}, "properties": {"repobilityId": "20bda40047d6302b", "scanner": "scanner-primary", "fingerprint": "f04ba7eb0349dd99", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3187a99a102df5a5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/news/page.tsx:80"}, "properties": {"repobilityId": "0343bf7c9eb196d1", "scanner": "scanner-primary", "fingerprint": "3187a99a102df5a5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-cafd10264b9a1180", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/news/[slug]/page.tsx:125"}, "properties": {"repobilityId": "13970524c9f526a2", "scanner": "scanner-primary", "fingerprint": "cafd10264b9a1180", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-66d78e8d0e127aa4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(marketing)/blog/[slug]/page.tsx:127"}, "properties": {"repobilityId": "722281a87c7c81c5", "scanner": "scanner-primary", "fingerprint": "66d78e8d0e127aa4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9413d2a5fc0fec79", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/(auth)/register/page.tsx:340"}, "properties": {"repobilityId": "175ee86251d2bac2", "scanner": "scanner-primary", "fingerprint": "9413d2a5fc0fec79", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-171008e00da9ec72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(super-admin)/super-admin/resources/resources-client.tsx:184"}, "properties": {"repobilityId": "3c2824414487a18a", "scanner": "scanner-primary", "fingerprint": "171008e00da9ec72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff8fb23bd48d57b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(super-admin)/super-admin/blog/[id]/edit/page.tsx:24"}, "properties": {"repobilityId": "bd79349a9fe10259", "scanner": "scanner-primary", "fingerprint": "ff8fb23bd48d57b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2f51df28373b65e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/pages-list-client.tsx:86"}, "properties": {"repobilityId": "5d07304a1eb33481", "scanner": "scanner-primary", "fingerprint": "b2f51df28373b65e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b17b4eae1f491e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/post-form.tsx:405"}, "properties": {"repobilityId": "e88841f22e3bb969", "scanner": "scanner-primary", "fingerprint": "8b17b4eae1f491e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d4a7c3dc40fd86a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/admin-shell.tsx:94"}, "properties": {"repobilityId": "00c24acca8728ab0", "scanner": "scanner-primary", "fingerprint": "6d4a7c3dc40fd86a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68a0198a061867be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/rich-text-editor.tsx:101"}, "properties": {"repobilityId": "ef65248d7650d655", "scanner": "scanner-primary", "fingerprint": "68a0198a061867be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a709639307ecd17b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/retailer-links.tsx:343"}, "properties": {"repobilityId": "c378db6cc49b3515", "scanner": "scanner-primary", "fingerprint": "a709639307ecd17b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8189711275f53fd8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/specials-list-client.tsx:130"}, "properties": {"repobilityId": "7f922b3405ceb3fa", "scanner": "scanner-primary", "fingerprint": "8189711275f53fd8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7de2503a76cc0710", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/books/arc-tab.tsx:423"}, "properties": {"repobilityId": "253daf5ee927a7a4", "scanner": "scanner-primary", "fingerprint": "7de2503a76cc0710", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a183dd96847ede8", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/super-admin/support-emails-panel.tsx:62"}, "properties": {"repobilityId": "de658b13853c1c73", "scanner": "scanner-primary", "fingerprint": "0a183dd96847ede8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-75206e9db571509a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/mass-email-panel.tsx:171"}, "properties": {"repobilityId": "58204110de9a5388", "scanner": "scanner-primary", "fingerprint": "75206e9db571509a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ca73521b592d522", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/social-links-panel.tsx:235"}, "properties": {"repobilityId": "f1c6711698f20d7f", "scanner": "scanner-primary", "fingerprint": "0ca73521b592d522", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a927e601d425792", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/beta-mode-panel.tsx:380"}, "properties": {"repobilityId": "a9f211566c53a046", "scanner": "scanner-primary", "fingerprint": "8a927e601d425792", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b48da921af89bfe7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/blog-posts-client.tsx:172"}, "properties": {"repobilityId": "51162354b7958475", "scanner": "scanner-primary", "fingerprint": "b48da921af89bfe7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a852e53d4031856c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/platform-post-form.tsx:460"}, "properties": {"repobilityId": "94e91c4b4290ebcb", "scanner": "scanner-primary", "fingerprint": "a852e53d4031856c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f473127dc55bfa7a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/super-admin/testimonials-panel.tsx:374"}, "properties": {"repobilityId": "ba88a79b90934277", "scanner": "scanner-primary", "fingerprint": "f473127dc55bfa7a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b61e99fbb03c256c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/super-admin/help-centre-admin.tsx:403"}, "properties": {"repobilityId": "e3fab0a905e015a4", "scanner": "scanner-primary", "fingerprint": "b61e99fbb03c256c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d49bfd48e5fbb368", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/super-admin/help-centre-admin.tsx:115"}, "properties": {"repobilityId": "264c44a8c6e5fc76", "scanner": "scanner-primary", "fingerprint": "d49bfd48e5fbb368", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f1244e2004a1e74f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/marketing/testimonial-card.tsx:33"}, "properties": {"repobilityId": "f0c6b0866c84e08d", "scanner": "scanner-primary", "fingerprint": "f1244e2004a1e74f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8a7ae82032137bfd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/marketing/browser-mockup.tsx:20"}, "properties": {"repobilityId": "6de358158cdb4e21", "scanner": "scanner-primary", "fingerprint": "8a7ae82032137bfd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90a47db9debf3818", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/marketing/faq-page-list.tsx:61"}, "properties": {"repobilityId": "18858032558279a6", "scanner": "scanner-primary", "fingerprint": "90a47db9debf3818", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b05793661a718434", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/marketing/midnight-testimonials-section.tsx:49"}, "properties": {"repobilityId": "6d65e359ed2ffbf2", "scanner": "scanner-primary", "fingerprint": "b05793661a718434", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e61d70a817558ded", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/book-overview.tsx:23"}, "properties": {"repobilityId": "6c8981dbec26b0ed", "scanner": "scanner-primary", "fingerprint": "e61d70a817558ded", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d82256765b71e491", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/book-carousel.tsx:243"}, "properties": {"repobilityId": "1b86b2d897a1c7bc", "scanner": "scanner-primary", "fingerprint": "d82256765b71e491", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0736f9ee0ca2d314", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/cart-drawer.tsx:213"}, "properties": {"repobilityId": "bc3dba2531594664", "scanner": "scanner-primary", "fingerprint": "0736f9ee0ca2d314", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf4687206109ef16", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/book-excerpt-modal.tsx:97"}, "properties": {"repobilityId": "8ec29f3272b00f32", "scanner": "scanner-primary", "fingerprint": "cf4687206109ef16", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-df743868b6f28261", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/book-card.tsx:255"}, "properties": {"repobilityId": "d74b3590d7f08ad6", "scanner": "scanner-primary", "fingerprint": "df743868b6f28261", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e477e56d425e04fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/templates/minimal.tsx:43"}, "properties": {"repobilityId": "10d9297d0c3d84a3", "scanner": "scanner-primary", "fingerprint": "e477e56d425e04fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd2e7d2731edde20", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/minimal.tsx:169"}, "properties": {"repobilityId": "dd2c0ee70a39f7ac", "scanner": "scanner-primary", "fingerprint": "fd2e7d2731edde20", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7d5abdac816af0be", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/bold.tsx:49"}, "properties": {"repobilityId": "a1c3fe15cedeb3c7", "scanner": "scanner-primary", "fingerprint": "7d5abdac816af0be", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e902d89671cc149c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/author-site/templates/classic.tsx:143"}, "properties": {"repobilityId": "b08c1ee5cfe0371e", "scanner": "scanner-primary", "fingerprint": "e902d89671cc149c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d62088e27ce39ac", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/classic.tsx:57"}, "properties": {"repobilityId": "a56a9ae05f372437", "scanner": "scanner-primary", "fingerprint": "5d62088e27ce39ac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7740e41cfe2e9dea", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/author-site/templates/cinematic.tsx:106"}, "properties": {"repobilityId": "4bc78acfd46ef5ab", "scanner": "scanner-primary", "fingerprint": "7740e41cfe2e9dea", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-73b7dfecc78bed33", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/audit-logger.ts:27"}, "properties": {"repobilityId": "1b2fed03b7a812a8", "scanner": "scanner-primary", "fingerprint": "73b7dfecc78bed33", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cb60a4dadc9ed81b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/sanitize.ts:4"}, "properties": {"repobilityId": "2c67af4e82a52bfb", "scanner": "scanner-primary", "fingerprint": "cb60a4dadc9ed81b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-728fb6569dc52753", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-blog.ts:89"}, "properties": {"repobilityId": "e1d9d3f3b4bf1a2a", "scanner": "scanner-primary", "fingerprint": "728fb6569dc52753", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a7b06cf9368b1d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:26"}, "properties": {"repobilityId": "f77d7e0fb34b08e2", "scanner": "scanner-primary", "fingerprint": "4a7b06cf9368b1d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60bd2b2eb172365d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:78"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "60bd2b2eb172365d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-12fbd83aaa27221f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(admin)/admin/newsletter/newsletter-client.tsx:391"}, "properties": {"repobilityId": "300c4435424ad023", "scanner": "scanner-primary", "fingerprint": "12fbd83aaa27221f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(admin)/admin/newsletter/newsletter-client.tsx"}, "region": {"startLine": 391}}}]}, {"ruleId": "scanner-4d90869998ef9366", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(admin)/admin/help/help-articles.tsx:28"}, "properties": {"repobilityId": "8fbde5e0ca8ff002", "scanner": "scanner-primary", "fingerprint": "4d90869998ef9366", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(admin)/admin/help/help-articles.tsx"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-9a207d8095e39a51", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/specials/page.tsx:114"}, "properties": {"repobilityId": "447bc030b4b25491", "scanner": "scanner-primary", "fingerprint": "9a207d8095e39a51", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(author-site)/[domain]/specials/page.tsx"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-07abbf86f41764fc", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/books/[slug]/page.tsx:194"}, "properties": {"repobilityId": "9c5b40029b81ab39", "scanner": "scanner-primary", "fingerprint": "07abbf86f41764fc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(author-site)/[domain]/books/[slug]/page.tsx"}, "region": {"startLine": 194}}}]}, {"ruleId": "scanner-12eb40fe7016e60e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/legal/page.tsx:107"}, "properties": {"repobilityId": "7a7f6dcf2d1a6a65", "scanner": "scanner-primary", "fingerprint": "12eb40fe7016e60e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(author-site)/[domain]/legal/page.tsx"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-28d972f4281e97cc", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/about/page.tsx:153"}, "properties": {"repobilityId": "ef5196f8c0fce62c", "scanner": "scanner-primary", "fingerprint": "28d972f4281e97cc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(author-site)/[domain]/about/page.tsx"}, "region": {"startLine": 153}}}]}, {"ruleId": "scanner-2b89cde028136e94", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/series/[slug]/page.tsx:92"}, "properties": {"repobilityId": "59f89e83fa974e4e", "scanner": "scanner-primary", "fingerprint": "2b89cde028136e94", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(author-site)/[domain]/series/[slug]/page.tsx"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-a7ad15070f77c915", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/media-kit/page.tsx:147"}, "properties": {"repobilityId": "ed8455a915de2503", "scanner": "scanner-primary", "fingerprint": "a7ad15070f77c915", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(author-site)/[domain]/media-kit/page.tsx"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-1b60599e48576162", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/[pageSlug]/page.tsx:92"}, "properties": {"repobilityId": "26852db96256d2ae", "scanner": "scanner-primary", "fingerprint": "1b60599e48576162", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(author-site)/[domain]/[pageSlug]/page.tsx"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-b23c47e026e52269", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(author-site)/[domain]/blog/[slug]/page.tsx:104"}, "properties": {"repobilityId": "764348f4df837bac", "scanner": "scanner-primary", "fingerprint": "b23c47e026e52269", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(author-site)/[domain]/blog/[slug]/page.tsx"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-8df489ed972e4b83", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/page.tsx:436"}, "properties": {"repobilityId": "02614b81e7b9928d", "scanner": "scanner-primary", "fingerprint": "8df489ed972e4b83", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(marketing)/page.tsx"}, "region": {"startLine": 436}}}]}, {"ruleId": "scanner-52159f3eb5db9f0f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/bookstore/page.tsx:105"}, "properties": {"repobilityId": "9044fba2409d3a43", "scanner": "scanner-primary", "fingerprint": "52159f3eb5db9f0f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(marketing)/bookstore/page.tsx"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-21d23800f16b6a53", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/bookstore/genre/[slug]/page.tsx:86"}, "properties": {"repobilityId": "13e84332f79876c2", "scanner": "scanner-primary", "fingerprint": "21d23800f16b6a53", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(marketing)/bookstore/genre/[slug]/page.tsx"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-f1b4bae62dee0acc", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/faq/page.tsx:103"}, "properties": {"repobilityId": "0a2bfa39be795c06", "scanner": "scanner-primary", "fingerprint": "f1b4bae62dee0acc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(marketing)/faq/page.tsx"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-03df5bf3194b4c76", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/news/page.tsx:80"}, "properties": {"repobilityId": "4020823d6e53287f", "scanner": "scanner-primary", "fingerprint": "03df5bf3194b4c76", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(marketing)/news/page.tsx"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-917b8c9790465518", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/news/[slug]/page.tsx:125"}, "properties": {"repobilityId": "e27ab7f4fd78d4df", "scanner": "scanner-primary", "fingerprint": "917b8c9790465518", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(marketing)/news/[slug]/page.tsx"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-42b960a277be2e97", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(marketing)/blog/[slug]/page.tsx:127"}, "properties": {"repobilityId": "dbe165bf10374c5b", "scanner": "scanner-primary", "fingerprint": "42b960a277be2e97", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(marketing)/blog/[slug]/page.tsx"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-647a801f093e4cc1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/(auth)/register/page.tsx:340"}, "properties": {"repobilityId": "881fff9e4edc6d49", "scanner": "scanner-primary", "fingerprint": "647a801f093e4cc1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(auth)/register/page.tsx"}, "region": {"startLine": 340}}}]}, {"ruleId": "scanner-42221d9a52726766", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/super-admin/testimonials-panel.tsx:374"}, "properties": {"repobilityId": "793d2fe7ecf3a844", "scanner": "scanner-primary", "fingerprint": "42221d9a52726766", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/super-admin/testimonials-panel.tsx"}, "region": {"startLine": 374}}}]}, {"ruleId": "scanner-97ec03941dd6e86e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/super-admin/help-centre-admin.tsx:115"}, "properties": {"repobilityId": "7f487d819a57f0ac", "scanner": "scanner-primary", "fingerprint": "97ec03941dd6e86e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/super-admin/help-centre-admin.tsx"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-08780790cd04f324", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/marketing/testimonial-card.tsx:33"}, "properties": {"repobilityId": "6365694a43380ad6", "scanner": "scanner-primary", "fingerprint": "08780790cd04f324", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/marketing/testimonial-card.tsx"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-08b4ce096f7927b5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/marketing/faq-page-list.tsx:61"}, "properties": {"repobilityId": "073bbed75fc27057", "scanner": "scanner-primary", "fingerprint": "08b4ce096f7927b5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/marketing/faq-page-list.tsx"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-b1f99bd155a1defb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/marketing/midnight-testimonials-section.tsx:49"}, "properties": {"repobilityId": "badeb8fe58917f31", "scanner": "scanner-primary", "fingerprint": "b1f99bd155a1defb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/marketing/midnight-testimonials-section.tsx"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-6d6f8ee421641b49", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/author-site/book-overview.tsx:23"}, "properties": {"repobilityId": "3b82a56f6f051cff", "scanner": "scanner-primary", "fingerprint": "6d6f8ee421641b49", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/author-site/book-overview.tsx"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-d831e96ff8275800", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/author-site/book-excerpt-modal.tsx:97"}, "properties": {"repobilityId": "23cf2e986cd6cbf6", "scanner": "scanner-primary", "fingerprint": "d831e96ff8275800", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/author-site/book-excerpt-modal.tsx"}, "region": {"startLine": 97}}}]}, {"ruleId": "scanner-946fabe96e0d4a10", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/author-site/book-card.tsx:255"}, "properties": {"repobilityId": "879bb2f33fe4c440", "scanner": "scanner-primary", "fingerprint": "946fabe96e0d4a10", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/author-site/book-card.tsx"}, "region": {"startLine": 255}}}]}, {"ruleId": "scanner-3afa6426f8aebd4d", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in src/lib/social/twitter.ts:58"}, "properties": {"repobilityId": "1371e9885465ead2", "scanner": "scanner-primary", "fingerprint": "3afa6426f8aebd4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/social/twitter.ts"}, "region": {"startLine": 58}}}]}, {"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": "9b8ee30e34f30c7b", "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": "b305d284a74956d2", "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": "b65e3aabff28afdb", "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": "ed42aa13e38d1184", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "431ddd7a9a4b7f50", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "aa2e1cc64e57c4b0", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e7e1cde3733a54ce", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: C\uf03aUsersandybDownloadsbookstage.claudelaunch.json"}, "properties": {"repobilityId": "511c562304a0b1ba", "scanner": "scanner-primary", "fingerprint": "e7e1cde3733a54ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agent_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "C\uf03aUsersandybDownloadsbookstage.claudelaunch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-71498d556c16a0ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/series/page.tsx:36"}, "properties": {"repobilityId": "5aca682c42e063f4", "scanner": "scanner-primary", "fingerprint": "71498d556c16a0ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-868e6f52084cf922", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/newsletter/newsletter-integration-inner.tsx:47"}, "properties": {"repobilityId": "4b221ef482936ffe", "scanner": "scanner-primary", "fingerprint": "868e6f52084cf922", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3bd904b4af0fe291", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/messages/messages-client.tsx:55"}, "properties": {"repobilityId": "eefa89549b25995c", "scanner": "scanner-primary", "fingerprint": "3bd904b4af0fe291", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-726dcb13dabf10bf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/discount-codes/page.tsx:81"}, "properties": {"repobilityId": "eed027d2fbf9e5db", "scanner": "scanner-primary", "fingerprint": "726dcb13dabf10bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-957299892cd45000", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/invoices/page.tsx:28"}, "properties": {"repobilityId": "0c20bdf0812a01b7", "scanner": "scanner-primary", "fingerprint": "957299892cd45000", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a79163f7d339b693", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/admin/genres/page.tsx:47"}, "properties": {"repobilityId": "2733b8834d21eabb", "scanner": "scanner-primary", "fingerprint": "a79163f7d339b693", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b3fd34ef1e5aaf27", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/admin/analytics/route.ts:14"}, "properties": {"repobilityId": "59690507d08fc1bf", "scanner": "scanner-primary", "fingerprint": "b3fd34ef1e5aaf27", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-496d62c1711a1972", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/super-admin/feature-config/route.ts:12"}, "properties": {"repobilityId": "37da09b07c4a630f", "scanner": "scanner-primary", "fingerprint": "496d62c1711a1972", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c41d2b077e7256cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/(author-site)/[domain]/layout.tsx:13"}, "properties": {"repobilityId": "d9c353a901296f1a", "scanner": "scanner-primary", "fingerprint": "c41d2b077e7256cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cdbba8fea7721a88", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/resource-downloads/downloads-client.tsx:79"}, "properties": {"repobilityId": "8dd13eacfac15d8b", "scanner": "scanner-primary", "fingerprint": "cdbba8fea7721a88", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e70d5e4e4f05df6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/access-requests/AccessRequestsTable.tsx:23"}, "properties": {"repobilityId": "04e093a75709829e", "scanner": "scanner-primary", "fingerprint": "7e70d5e4e4f05df6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-181d08a8b79cd7fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/authors/[id]/author-edit-form.tsx:501"}, "properties": {"repobilityId": "1b792041507637cd", "scanner": "scanner-primary", "fingerprint": "181d08a8b79cd7fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c83deef268a9d69e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/resources/resources-client.tsx:77"}, "properties": {"repobilityId": "cc17ac8acc87e473", "scanner": "scanner-primary", "fingerprint": "c83deef268a9d69e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fe3c2c82e40cb7d4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/coupons/coupons-client.tsx:53"}, "properties": {"repobilityId": "aa901031c9f5bfca", "scanner": "scanner-primary", "fingerprint": "fe3c2c82e40cb7d4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1faed16e146823dc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(super-admin)/super-admin/categories/categories-client.tsx:52"}, "properties": {"repobilityId": "5f5c369a93de93fe", "scanner": "scanner-primary", "fingerprint": "1faed16e146823dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f6c4ed924d9d1fe6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-csrf-token.ts:20"}, "properties": {"repobilityId": "45461e30debe1fc7", "scanner": "scanner-primary", "fingerprint": "f6c4ed924d9d1fe6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9306827f0e9dd08a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/impersonation-banner.tsx:13"}, "properties": {"repobilityId": "b25d6067a0ca99bb", "scanner": "scanner-primary", "fingerprint": "9306827f0e9dd08a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1bdbe3e849b618f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/flip-book-form.tsx:116"}, "properties": {"repobilityId": "cc11134ee4928640", "scanner": "scanner-primary", "fingerprint": "1bdbe3e849b618f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-507bccbac442316f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-preview-media.tsx:59"}, "properties": {"repobilityId": "a17dad3d47e9289c", "scanner": "scanner-primary", "fingerprint": "507bccbac442316f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-18cf5ab6f1c000ec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-form.tsx:370"}, "properties": {"repobilityId": "8cbe2dea29394f26", "scanner": "scanner-primary", "fingerprint": "18cf5ab6f1c000ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-47c484236386db90", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/special-form.tsx:62"}, "properties": {"repobilityId": "579524e989b2a23a", "scanner": "scanner-primary", "fingerprint": "47c484236386db90", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98d86a56552b770a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/onboarding-guided-modal.tsx:116"}, "properties": {"repobilityId": "00cafa6fe1e7f492", "scanner": "scanner-primary", "fingerprint": "98d86a56552b770a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e7b27cc5dab09d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/direct-sales-items.tsx:185"}, "properties": {"repobilityId": "3d5284b9e6175bc1", "scanner": "scanner-primary", "fingerprint": "9e7b27cc5dab09d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f70ae0336a69f7d3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/preorder-signups.tsx:24"}, "properties": {"repobilityId": "1b27a0e6945d255f", "scanner": "scanner-primary", "fingerprint": "f70ae0336a69f7d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1c3fbde97a009db0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/next-steps-card.tsx:21"}, "properties": {"repobilityId": "90a5f7fdd2047641", "scanner": "scanner-primary", "fingerprint": "1c3fbde97a009db0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-77e50305391ca0d3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-reviews.tsx:80"}, "properties": {"repobilityId": "2ad29a9bd30a4702", "scanner": "scanner-primary", "fingerprint": "77e50305391ca0d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a0c574abe33b2ba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/branding-form.tsx:128"}, "properties": {"repobilityId": "ccd9b1ace31efc9f", "scanner": "scanner-primary", "fingerprint": "7a0c574abe33b2ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-20d15f156e1c595c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/book-audio-tracks.tsx:302"}, "properties": {"repobilityId": "6b7cd572feada09d", "scanner": "scanner-primary", "fingerprint": "20d15f156e1c595c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4e60ea046c691f27", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/affiliate-settings.tsx:35"}, "properties": {"repobilityId": "b05e17105176bc96", "scanner": "scanner-primary", "fingerprint": "4e60ea046c691f27", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b6ad6ac4982019db", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/retailer-links.tsx:166"}, "properties": {"repobilityId": "3559868a64bd05f1", "scanner": "scanner-primary", "fingerprint": "b6ad6ac4982019db", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f2a7b46e45f546c5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/books/arc-tab.tsx:132"}, "properties": {"repobilityId": "6119ef946f0df6bb", "scanner": "scanner-primary", "fingerprint": "f2a7b46e45f546c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-41bdadd96b77856c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/help-article-form.tsx:54"}, "properties": {"repobilityId": "72b0706310cffcef", "scanner": "scanner-primary", "fingerprint": "41bdadd96b77856c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6abe926cc97e64f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/support-emails-panel.tsx:40"}, "properties": {"repobilityId": "d8cf7455a607f6ef", "scanner": "scanner-primary", "fingerprint": "6abe926cc97e64f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c6d7a09a6336c84", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/plan-form.tsx:136"}, "properties": {"repobilityId": "62f1661f880d287a", "scanner": "scanner-primary", "fingerprint": "5c6d7a09a6336c84", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b82ac873942015ff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/social-post-form.tsx:116"}, "properties": {"repobilityId": "5fbb0e9c275222af", "scanner": "scanner-primary", "fingerprint": "b82ac873942015ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97d2dba9089ee33b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/plans-table.tsx:61"}, "properties": {"repobilityId": "caa13c6538f2fb56", "scanner": "scanner-primary", "fingerprint": "97d2dba9089ee33b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8671cc78825efcf0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/platform-post-form.tsx:112"}, "properties": {"repobilityId": "56714f8212a916d3", "scanner": "scanner-primary", "fingerprint": "8671cc78825efcf0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f79e7c1bc238dd5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/seo-panel.tsx:169"}, "properties": {"repobilityId": "e75cd7c1ec36b6a8", "scanner": "scanner-primary", "fingerprint": "0f79e7c1bc238dd5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb61c3c7df305174", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/faqs-panel.tsx:160"}, "properties": {"repobilityId": "6b18056bd5c7b03a", "scanner": "scanner-primary", "fingerprint": "eb61c3c7df305174", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3dfeea44b068963d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/testimonials-panel.tsx:195"}, "properties": {"repobilityId": "cfe6ef4bc0aab307", "scanner": "scanner-primary", "fingerprint": "3dfeea44b068963d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f6e16a35893d8479", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/super-admin/help-centre-admin.tsx:59"}, "properties": {"repobilityId": "baabbb63d8851a19", "scanner": "scanner-primary", "fingerprint": "f6e16a35893d8479", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-23cda7aa63e70ca0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/email-integrations.ts:16"}, "properties": {"repobilityId": "17e4ac59ee645924", "scanner": "scanner-primary", "fingerprint": "23cda7aa63e70ca0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-42237bcf5c3321cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/supabase-storage.ts:198"}, "properties": {"repobilityId": "baa11394dcf28510", "scanner": "scanner-primary", "fingerprint": "42237bcf5c3321cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-902f685f060236cc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/linkedin.ts:82"}, "properties": {"repobilityId": "1f7fdd2d1d44e56a", "scanner": "scanner-primary", "fingerprint": "902f685f060236cc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e6bec4b5b287f4eb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/facebook.ts:56"}, "properties": {"repobilityId": "93e9c5dc95837626", "scanner": "scanner-primary", "fingerprint": "e6bec4b5b287f4eb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9571d411c931e936", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/instagram.ts:75"}, "properties": {"repobilityId": "0a28ac5e9192825e", "scanner": "scanner-primary", "fingerprint": "9571d411c931e936", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a960d4c94488b307", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/social/twitter.ts:131"}, "properties": {"repobilityId": "2a28d2ce1b1826f0", "scanner": "scanner-primary", "fingerprint": "a960d4c94488b307", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b8823f3c1581a787", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/__tests__/security.test.ts:27"}, "properties": {"repobilityId": "bff5bec2927fea66", "scanner": "scanner-primary", "fingerprint": "b8823f3c1581a787", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-59b992d62d86a65a", "level": "note", "message": {"text": "25 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "58b9516d72ffa8ba", "scanner": "scanner-primary", "fingerprint": "59b992d62d86a65a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}