{"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-4c3900c8f6291999", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-suggested-answers.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-suggested-answers.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-4a4d2184be7f3e21", "name": "Stray `console.log` in TS/JS \u2014 scripts/optimize-merci-cafe-assets.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/optimize-merci-cafe-assets.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-993bce9ba9de0ad9", "name": "Stray `console.log` in TS/JS \u2014 scripts/preview-magazine.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/preview-magazine.ts:39"}, "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-6910441bd5ce3876", "name": "Stray `console.log` in TS/JS \u2014 scripts/preview-magazine-index.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/preview-magazine-index.ts:60"}, "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-99a55fb330c3b9bf", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-qr-cafe-numerique.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-qr-cafe-numerique.ts:25"}, "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-f48f830aeea95041", "name": "Stray `console.log` in TS/JS \u2014 scripts/preview-subscriber-digest.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/preview-subscriber-digest.ts:43"}, "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-12712c6e0a6405e2", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-quiz.ts:405", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-quiz.ts:405"}, "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-16b6da5023192d11", "name": "Stray `console.log` in TS/JS \u2014 public/pagefind/pagefind-worker.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/pagefind/pagefind-worker.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc25e739478b573e", "name": "Stray `console.log` in TS/JS \u2014 public/pagefind/pagefind.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/pagefind/pagefind.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-07f8a26af31bb5b3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/latest-update-bar.tsx:27", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/latest-update-bar.tsx:27"}, "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-91d454c789460a10", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/search.tsx:231", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/search.tsx:231"}, "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-a97906f39f609297", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/breadcrumb.tsx:39", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/breadcrumb.tsx:39"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-827c3f6b3ae424ab", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/contact/route.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/contact/route.ts:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-19d6892d9f4b3b96", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/chat/feedback/route.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/chat/feedback/route.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-be0365d0090c3721", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/intel-inbox/route.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/intel-inbox/route.ts:68"}, "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-8a46ee1709106649", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/digest/route.ts:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/digest/route.ts:94"}, "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-86a72f27a24bc98f", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/feedback/route.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/feedback/route.ts:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f52772ea2a546724", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/digest/layout.tsx:42", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/digest/layout.tsx:42"}, "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-e6b3d53126fe9d58", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/layout.tsx:177", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/layout.tsx:177"}, "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-8d70b75b53b3ead3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/comparisons/[slug]/page.tsx:82", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/comparisons/[slug]/page.tsx:82"}, "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-624b0cde65c3296e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/solutions/[slug]/page.tsx:93", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/solutions/[slug]/page.tsx:93"}, "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-49f39235bd7c32b3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/dossiers/[slug]/page.tsx:149", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/dossiers/[slug]/page.tsx:149"}, "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-8cb25c604194ebfe", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/communes/[slug]/page.tsx:99", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/communes/[slug]/page.tsx:99"}, "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-5a40f74ab839fb19", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/sectors/[slug]/page.tsx:91", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/sectors/[slug]/page.tsx:91"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c087337a38f2b7f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/faq/page.tsx:70", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/faq/page.tsx:70"}, "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-5af0885a899e006f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/domains/[slug]/page.tsx:109", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/domains/[slug]/page.tsx:109"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5359e0db7df86cd8", "name": "Stray `console.log` in TS/JS \u2014 src/lib/refonte-votes.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/refonte-votes.ts:70"}, "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-4cfddeb4f8adccf6", "name": "Stray `console.log` in TS/JS \u2014 src/lib/chat-logs.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chat-logs.ts:91"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26bd7cd6a1588ca4", "name": "Stray `console.log` in TS/JS \u2014 src/lib/magazine/build.ts:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/magazine/build.ts:76"}, "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-eb0850b998864b17", "name": "Privileged port 5 in use", "shortDescription": {"text": "Privileged port 5 in use"}, "fullDescription": {"text": "Port 5 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a5c8da0b7ebc3db6", "name": "Privileged port 7 in use", "shortDescription": {"text": "Privileged port 7 in use"}, "fullDescription": {"text": "Port 7 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5ced138d5db5e5a5", "name": "Insecure pattern 'new_function_used' in next.config.ts:42", "shortDescription": {"text": "Insecure pattern 'new_function_used' in next.config.ts:42"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-91caf58472ff91c7", "name": "Insecure pattern 'direct_innerhtml_assignment' in scripts/gen-bookmarklet.mjs:51", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/gen-bookmarklet.mjs:51"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-15a4862822c14c7c", "name": "Insecure pattern 'node_child_process' in scripts/preview-magazine.ts:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/preview-magazine.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-493a22cea6cfd018", "name": "Insecure pattern 'node_child_process' in scripts/preview-magazine-index.ts:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/preview-magazine-index.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-79dfcb2c933f5651", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/pagefind/pagefind-ui.js:1", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/pagefind/pagefind-ui.js:1"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43e2faed0c7faec5", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/pagefind/pagefind-modular-ui.js:1", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/pagefind/pagefind-modular-ui.js:1"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c63be52733b65cb8", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/pagefind/pagefind-component-ui.js:4", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/pagefind/pagefind-component-ui.js:4"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-20b9aeaa8c09f2ae", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/search.tsx:231", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/search.tsx:231"}, "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-d04fc7354335552a", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/breadcrumb.tsx:39", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/breadcrumb.tsx:39"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10a96b643c86a73f", "name": "Insecure pattern 'cors_wildcard' in src/app/api/intel-inbox/route.ts:10", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/intel-inbox/route.ts:10"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8afc4070e4d1e363", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/digest/layout.tsx:42", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/digest/layout.tsx:42"}, "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-d752dd63b656c21e", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/layout.tsx:177", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/layout.tsx:177"}, "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-2339b3bc6a9677c8", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/comparisons/[slug]/page.tsx:82", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/comparisons/[slug]/page.tsx:82"}, "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-f4b92d697945fbde", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/solutions/[slug]/page.tsx:93", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/solutions/[slug]/page.tsx:93"}, "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-c3d0915c2d253036", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/dossiers/[slug]/page.tsx:149", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/dossiers/[slug]/page.tsx:149"}, "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-5287f2127dfbfb14", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/communes/[slug]/page.tsx:99", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/communes/[slug]/page.tsx:99"}, "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-f606f0881c89ef9c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/sectors/[slug]/page.tsx:91", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/sectors/[slug]/page.tsx:91"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-04c74444099a15c4", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/faq/page.tsx:70", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/faq/page.tsx:70"}, "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-d14f8b44a0bc0663", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/domains/[slug]/page.tsx:109", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/domains/[slug]/page.tsx:109"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76fd32e00079cc54", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f1a8e50a7610cf8", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9984e1622005b6c5", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "peaceiris/actions-gh-pages@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db20d066b3383340", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d88f8a614768dc72", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ebb0007d3133dc10", "name": "Very large file: src/components/chat-widget.tsx (1567 lines)", "shortDescription": {"text": "Very large file: src/components/chat-widget.tsx (1567 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "31 tests / 244 src (ratio 0.13)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 56 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 183 placeholder/mock markers across 18 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-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-07d4bc6a55220f55", "name": "Commented-code block (7 lines) in velite.config.ts:11", "shortDescription": {"text": "Commented-code block (7 lines) in velite.config.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11882e2bac40c522", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/optimize-merci-cafe-assets.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/optimize-merci-cafe-assets.ts: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-aab7031fbb639e49", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/pagefind/pagefind-worker.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/pagefind/pagefind-worker.js:1"}, "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-97fd848b34b04eda", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/pagefind/pagefind.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/pagefind/pagefind.js:1"}, "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-37f5e23c3dd76901", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/preferences-form.tsx:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/preferences-form.tsx:46"}, "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-6854e1ba67d36790", "name": "Commented-code block (5 lines) in src/components/proof-drawer/proof-drawer.tsx:339", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/proof-drawer/proof-drawer.tsx:339"}, "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-736b5afbb2744541", "name": "Commented-code block (5 lines) in src/components/proof-drawer/proof-drawer-trigger.tsx:44", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/proof-drawer/proof-drawer-trigger.tsx:44"}, "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-f30a80d243b10121", "name": "Commented-code block (6 lines) in src/components/proof-drawer/metrics-context.tsx:56", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/proof-drawer/metrics-context.tsx:56"}, "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-101d18f43cfb4a27", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/quiz/bgm-quiz.tsx:142", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/quiz/bgm-quiz.tsx:142"}, "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-31f31708bf32e748", "name": "Commented-code block (6 lines) in src/components/dossier/density/density-context.tsx:42", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/dossier/density/density-context.tsx:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-438e314ea731af9f", "name": "Commented-code block (7 lines) in src/app/sitemap.ts:187", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/sitemap.ts:187"}, "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-3838fd2d81ed01c5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/review/publish/route.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/review/publish/route.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-c506a68fa5b25a1b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/review/reject/route.ts:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/review/reject/route.ts:57"}, "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-fa799a9f0887b93a", "name": "Commented-code block (5 lines) in src/lib/radar.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/radar.ts:30"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d0b17c8c07a7421d", "name": "8 env vars used in code but missing from .env.example", "shortDescription": {"text": "8 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `HOME`, `INBOX_CTA_LABEL`, `INBOX_CTA_URL`, `KV_REST_API_TOKEN`, `KV_REST_API_URL`, `NODE_ENV`, `UMAMI_WEBSITE_ID`, `VERCEL`. 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/23698"}, "properties": {"repository": "zoltan2/brussels-governance-monitor", "repoUrl": "https://github.com/zoltan2/brussels-governance-monitor", "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-4c3900c8f6291999", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-suggested-answers.ts:89"}, "properties": {"repobilityId": "4b3ac3907e75b7b3", "scanner": "scanner-primary", "fingerprint": "4c3900c8f6291999", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a4d2184be7f3e21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/optimize-merci-cafe-assets.ts:26"}, "properties": {"repobilityId": "59c3690cd840e242", "scanner": "scanner-primary", "fingerprint": "4a4d2184be7f3e21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-993bce9ba9de0ad9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/preview-magazine.ts:39"}, "properties": {"repobilityId": "1da7dce4bc596dc0", "scanner": "scanner-primary", "fingerprint": "993bce9ba9de0ad9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6910441bd5ce3876", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/preview-magazine-index.ts:60"}, "properties": {"repobilityId": "db08043e533cdc14", "scanner": "scanner-primary", "fingerprint": "6910441bd5ce3876", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-99a55fb330c3b9bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-qr-cafe-numerique.ts:25"}, "properties": {"repobilityId": "7b25460872bb3f6b", "scanner": "scanner-primary", "fingerprint": "99a55fb330c3b9bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f48f830aeea95041", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/preview-subscriber-digest.ts:43"}, "properties": {"repobilityId": "feaf5f55eca805dc", "scanner": "scanner-primary", "fingerprint": "f48f830aeea95041", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-12712c6e0a6405e2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-quiz.ts:405"}, "properties": {"repobilityId": "9ce3932d32a871ef", "scanner": "scanner-primary", "fingerprint": "12712c6e0a6405e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-16b6da5023192d11", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/pagefind/pagefind-worker.js:6"}, "properties": {"repobilityId": "3efb60bca5335b4c", "scanner": "scanner-primary", "fingerprint": "16b6da5023192d11", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc25e739478b573e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/pagefind/pagefind.js:6"}, "properties": {"repobilityId": "b31f56d9ae93fd03", "scanner": "scanner-primary", "fingerprint": "fc25e739478b573e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-07f8a26af31bb5b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/latest-update-bar.tsx:27"}, "properties": {"repobilityId": "cdcf1d1c25578952", "scanner": "scanner-primary", "fingerprint": "07f8a26af31bb5b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91d454c789460a10", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/search.tsx:231"}, "properties": {"repobilityId": "864f4d5a2fc51010", "scanner": "scanner-primary", "fingerprint": "91d454c789460a10", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a97906f39f609297", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/breadcrumb.tsx:39"}, "properties": {"repobilityId": "6caa1e57c00a1b09", "scanner": "scanner-primary", "fingerprint": "a97906f39f609297", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-827c3f6b3ae424ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/contact/route.ts:40"}, "properties": {"repobilityId": "25ccd182ecff5fdf", "scanner": "scanner-primary", "fingerprint": "827c3f6b3ae424ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19d6892d9f4b3b96", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/chat/feedback/route.ts:89"}, "properties": {"repobilityId": "3dc9269474a5e0ed", "scanner": "scanner-primary", "fingerprint": "19d6892d9f4b3b96", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-be0365d0090c3721", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/intel-inbox/route.ts:68"}, "properties": {"repobilityId": "acc90aad565cdc20", "scanner": "scanner-primary", "fingerprint": "be0365d0090c3721", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8a46ee1709106649", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/digest/route.ts:94"}, "properties": {"repobilityId": "c1f571cccddddfc8", "scanner": "scanner-primary", "fingerprint": "8a46ee1709106649", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-86a72f27a24bc98f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/feedback/route.ts:44"}, "properties": {"repobilityId": "50c49405654d39f7", "scanner": "scanner-primary", "fingerprint": "86a72f27a24bc98f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f52772ea2a546724", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/digest/layout.tsx:42"}, "properties": {"repobilityId": "64897c03b89d2513", "scanner": "scanner-primary", "fingerprint": "f52772ea2a546724", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e6b3d53126fe9d58", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/layout.tsx:177"}, "properties": {"repobilityId": "de918fa54268f3b9", "scanner": "scanner-primary", "fingerprint": "e6b3d53126fe9d58", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8d70b75b53b3ead3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/comparisons/[slug]/page.tsx:82"}, "properties": {"repobilityId": "19e205e02f914181", "scanner": "scanner-primary", "fingerprint": "8d70b75b53b3ead3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-624b0cde65c3296e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/solutions/[slug]/page.tsx:93"}, "properties": {"repobilityId": "ffb0a025f6537d90", "scanner": "scanner-primary", "fingerprint": "624b0cde65c3296e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-49f39235bd7c32b3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/dossiers/[slug]/page.tsx:149"}, "properties": {"repobilityId": "2a768c55e1a7c22d", "scanner": "scanner-primary", "fingerprint": "49f39235bd7c32b3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8cb25c604194ebfe", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/communes/[slug]/page.tsx:99"}, "properties": {"repobilityId": "2e820e2592b145b1", "scanner": "scanner-primary", "fingerprint": "8cb25c604194ebfe", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5a40f74ab839fb19", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/sectors/[slug]/page.tsx:91"}, "properties": {"repobilityId": "eebc215b157a8243", "scanner": "scanner-primary", "fingerprint": "5a40f74ab839fb19", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1c087337a38f2b7f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/faq/page.tsx:70"}, "properties": {"repobilityId": "707957a90bb2ed1c", "scanner": "scanner-primary", "fingerprint": "1c087337a38f2b7f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5af0885a899e006f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/domains/[slug]/page.tsx:109"}, "properties": {"repobilityId": "f0f10f18d981fe02", "scanner": "scanner-primary", "fingerprint": "5af0885a899e006f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5359e0db7df86cd8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/refonte-votes.ts:70"}, "properties": {"repobilityId": "8df1c865207bfd19", "scanner": "scanner-primary", "fingerprint": "5359e0db7df86cd8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4cfddeb4f8adccf6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/chat-logs.ts:91"}, "properties": {"repobilityId": "ee21413d3b20fdff", "scanner": "scanner-primary", "fingerprint": "4cfddeb4f8adccf6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-26bd7cd6a1588ca4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/magazine/build.ts:76"}, "properties": {"repobilityId": "de524687865ecb04", "scanner": "scanner-primary", "fingerprint": "26bd7cd6a1588ca4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb0850b998864b17", "level": "warning", "message": {"text": "Privileged port 5 in use"}, "properties": {"repobilityId": "a8f80b4866464301", "scanner": "scanner-primary", "fingerprint": "eb0850b998864b17", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/refresh-quiz.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a5c8da0b7ebc3db6", "level": "warning", "message": {"text": "Privileged port 7 in use"}, "properties": {"repobilityId": "428a6faecc63b5d6", "scanner": "scanner-primary", "fingerprint": "a5c8da0b7ebc3db6", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/refresh-quiz.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5ced138d5db5e5a5", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in next.config.ts:42"}, "properties": {"repobilityId": "c0fe24f52d837aaa", "scanner": "scanner-primary", "fingerprint": "5ced138d5db5e5a5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "next.config.ts"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-91caf58472ff91c7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/gen-bookmarklet.mjs:51"}, "properties": {"repobilityId": "2c412bcb97931b9e", "scanner": "scanner-primary", "fingerprint": "91caf58472ff91c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/gen-bookmarklet.mjs"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-15a4862822c14c7c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/preview-magazine.ts:14"}, "properties": {"repobilityId": "145a8d734cfc5980", "scanner": "scanner-primary", "fingerprint": "15a4862822c14c7c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/preview-magazine.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-493a22cea6cfd018", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/preview-magazine-index.ts:15"}, "properties": {"repobilityId": "26b65a9378af8861", "scanner": "scanner-primary", "fingerprint": "493a22cea6cfd018", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/preview-magazine-index.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-79dfcb2c933f5651", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/pagefind/pagefind-ui.js:1"}, "properties": {"repobilityId": "26aa7a87b9f491c0", "scanner": "scanner-primary", "fingerprint": "79dfcb2c933f5651", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/pagefind/pagefind-ui.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-43e2faed0c7faec5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/pagefind/pagefind-modular-ui.js:1"}, "properties": {"repobilityId": "39cb0a1fa2c50a7d", "scanner": "scanner-primary", "fingerprint": "43e2faed0c7faec5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/pagefind/pagefind-modular-ui.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c63be52733b65cb8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/pagefind/pagefind-component-ui.js:4"}, "properties": {"repobilityId": "3a06a469c9b5bd45", "scanner": "scanner-primary", "fingerprint": "c63be52733b65cb8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/pagefind/pagefind-component-ui.js"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-20b9aeaa8c09f2ae", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/search.tsx:231"}, "properties": {"repobilityId": "a2e906a9e60a9666", "scanner": "scanner-primary", "fingerprint": "20b9aeaa8c09f2ae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/search.tsx"}, "region": {"startLine": 231}}}]}, {"ruleId": "scanner-d04fc7354335552a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/breadcrumb.tsx:39"}, "properties": {"repobilityId": "bf74e3164d546bbb", "scanner": "scanner-primary", "fingerprint": "d04fc7354335552a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/breadcrumb.tsx"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-10a96b643c86a73f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/intel-inbox/route.ts:10"}, "properties": {"repobilityId": "f0038ddc6890959a", "scanner": "scanner-primary", "fingerprint": "10a96b643c86a73f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/intel-inbox/route.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-8afc4070e4d1e363", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/digest/layout.tsx:42"}, "properties": {"repobilityId": "f7d7be1b659954f9", "scanner": "scanner-primary", "fingerprint": "8afc4070e4d1e363", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/digest/layout.tsx"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-d752dd63b656c21e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/layout.tsx:177"}, "properties": {"repobilityId": "6221240d83c49cf6", "scanner": "scanner-primary", "fingerprint": "d752dd63b656c21e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/layout.tsx"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-2339b3bc6a9677c8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/comparisons/[slug]/page.tsx:82"}, "properties": {"repobilityId": "892926490c2f15fb", "scanner": "scanner-primary", "fingerprint": "2339b3bc6a9677c8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/comparisons/[slug]/page.tsx"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-f4b92d697945fbde", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/solutions/[slug]/page.tsx:93"}, "properties": {"repobilityId": "77eec0fd06d84c62", "scanner": "scanner-primary", "fingerprint": "f4b92d697945fbde", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/solutions/[slug]/page.tsx"}, "region": {"startLine": 93}}}]}, {"ruleId": "scanner-c3d0915c2d253036", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/dossiers/[slug]/page.tsx:149"}, "properties": {"repobilityId": "3e2086fff28e0218", "scanner": "scanner-primary", "fingerprint": "c3d0915c2d253036", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/dossiers/[slug]/page.tsx"}, "region": {"startLine": 149}}}]}, {"ruleId": "scanner-5287f2127dfbfb14", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/communes/[slug]/page.tsx:99"}, "properties": {"repobilityId": "8090cc95d0565013", "scanner": "scanner-primary", "fingerprint": "5287f2127dfbfb14", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/communes/[slug]/page.tsx"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-f606f0881c89ef9c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/sectors/[slug]/page.tsx:91"}, "properties": {"repobilityId": "5c8cc599ac0198e6", "scanner": "scanner-primary", "fingerprint": "f606f0881c89ef9c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/sectors/[slug]/page.tsx"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-04c74444099a15c4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/faq/page.tsx:70"}, "properties": {"repobilityId": "9c4572df85259803", "scanner": "scanner-primary", "fingerprint": "04c74444099a15c4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/faq/page.tsx"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-d14f8b44a0bc0663", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/domains/[slug]/page.tsx:109"}, "properties": {"repobilityId": "715693a27b6acfc3", "scanner": "scanner-primary", "fingerprint": "d14f8b44a0bc0663", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/domains/[slug]/page.tsx"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-76fd32e00079cc54", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3c7ca4c6c533114b", "scanner": "scanner-primary", "fingerprint": "76fd32e00079cc54", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/refresh-quiz.yml"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-2f1a8e50a7610cf8", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "53bb27493531891d", "scanner": "scanner-primary", "fingerprint": "2f1a8e50a7610cf8", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/refresh-quiz.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9984e1622005b6c5", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7067cef2ea2afdd8", "scanner": "scanner-primary", "fingerprint": "9984e1622005b6c5", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/magazine.yml"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-db20d066b3383340", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "97d9d7da095f5b35", "scanner": "scanner-primary", "fingerprint": "db20d066b3383340", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/magazine.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d88f8a614768dc72", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5463e81fda51205a", "scanner": "scanner-primary", "fingerprint": "d88f8a614768dc72", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/content-lint.yml"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-ebb0007d3133dc10", "level": "note", "message": {"text": "Very large file: src/components/chat-widget.tsx (1567 lines)"}, "properties": {"repobilityId": "1167029739f6a3c5", "scanner": "scanner-primary", "fingerprint": "ebb0007d3133dc10", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "ad1504cc1331195d", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "6e118f4459702f32", "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": "1824a40b5b0c559c", "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": "90b6d6371b52b4d6", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "266690e45047575d", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "6470daff49abe564", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-07d4bc6a55220f55", "level": "none", "message": {"text": "Commented-code block (7 lines) in velite.config.ts:11"}, "properties": {"repobilityId": "5d9d584215b644bf", "scanner": "scanner-primary", "fingerprint": "07d4bc6a55220f55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11882e2bac40c522", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/optimize-merci-cafe-assets.ts:36"}, "properties": {"repobilityId": "0291020f23bd0e0a", "scanner": "scanner-primary", "fingerprint": "11882e2bac40c522", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aab7031fbb639e49", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/pagefind/pagefind-worker.js:1"}, "properties": {"repobilityId": "3c460eadd186e8fe", "scanner": "scanner-primary", "fingerprint": "aab7031fbb639e49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97fd848b34b04eda", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/pagefind/pagefind.js:1"}, "properties": {"repobilityId": "b4bcf0806141a76f", "scanner": "scanner-primary", "fingerprint": "97fd848b34b04eda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37f5e23c3dd76901", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/preferences-form.tsx:46"}, "properties": {"repobilityId": "c41901632c0d620b", "scanner": "scanner-primary", "fingerprint": "37f5e23c3dd76901", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6854e1ba67d36790", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/proof-drawer/proof-drawer.tsx:339"}, "properties": {"repobilityId": "b2bc507eca0f84c4", "scanner": "scanner-primary", "fingerprint": "6854e1ba67d36790", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-736b5afbb2744541", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/proof-drawer/proof-drawer-trigger.tsx:44"}, "properties": {"repobilityId": "897401154471116b", "scanner": "scanner-primary", "fingerprint": "736b5afbb2744541", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f30a80d243b10121", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/proof-drawer/metrics-context.tsx:56"}, "properties": {"repobilityId": "efe14c908fb45353", "scanner": "scanner-primary", "fingerprint": "f30a80d243b10121", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-101d18f43cfb4a27", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/quiz/bgm-quiz.tsx:142"}, "properties": {"repobilityId": "6c701551039bf278", "scanner": "scanner-primary", "fingerprint": "101d18f43cfb4a27", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-31f31708bf32e748", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/dossier/density/density-context.tsx:42"}, "properties": {"repobilityId": "cdd09e94aa58bc57", "scanner": "scanner-primary", "fingerprint": "31f31708bf32e748", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-438e314ea731af9f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/sitemap.ts:187"}, "properties": {"repobilityId": "79b758fb18d2d00c", "scanner": "scanner-primary", "fingerprint": "438e314ea731af9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3838fd2d81ed01c5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/review/publish/route.ts:56"}, "properties": {"repobilityId": "ee5be121824be9c9", "scanner": "scanner-primary", "fingerprint": "3838fd2d81ed01c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c506a68fa5b25a1b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/review/reject/route.ts:57"}, "properties": {"repobilityId": "7012ad18c2a90904", "scanner": "scanner-primary", "fingerprint": "c506a68fa5b25a1b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fa799a9f0887b93a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/radar.ts:30"}, "properties": {"repobilityId": "2c2fd9b943d239cd", "scanner": "scanner-primary", "fingerprint": "fa799a9f0887b93a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0b17c8c07a7421d", "level": "note", "message": {"text": "8 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "17fe720e8247f9df", "scanner": "scanner-primary", "fingerprint": "d0b17c8c07a7421d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}