{"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-6165713588c087b7", "name": "Possibly dead Python function: work", "shortDescription": {"text": "Possibly dead Python function: work"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0249093e28256eec", "name": "Possibly dead Python function: run_mode", "shortDescription": {"text": "Possibly dead Python function: run_mode"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a9f118ca675787a8", "name": "Possibly dead Python function: verify_adapter_secret", "shortDescription": {"text": "Possibly dead Python function: verify_adapter_secret"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b4902c63b1637f7", "name": "Possibly dead Python function: generate_summary_sync", "shortDescription": {"text": "Possibly dead Python function: generate_summary_sync"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6274d4f74cb78ce4", "name": "Possibly dead Python function: health_check", "shortDescription": {"text": "Possibly dead Python function: health_check"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2dd5fc38214cb414", "name": "Possibly dead Python function: scan_document_tables", "shortDescription": {"text": "Possibly dead Python function: scan_document_tables"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94aa8172d9648740", "name": "Possibly dead Python function: require_auth", "shortDescription": {"text": "Possibly dead Python function: require_auth"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41263d0e8f081afc", "name": "Possibly dead Python function: require_admin", "shortDescription": {"text": "Possibly dead Python function: require_admin"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e186984c7e0d930", "name": "Possibly dead Python function: cache_delete_pattern", "shortDescription": {"text": "Possibly dead Python function: cache_delete_pattern"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ebf3d0f26f5eaa37", "name": "Possibly dead Python function: do_run_migrations", "shortDescription": {"text": "Possibly dead Python function: do_run_migrations"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8b72eb6676cb446f", "name": "Stray `console.log` in TS/JS \u2014 frontend/scripts/check-public-i18n.js:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/scripts/check-public-i18n.js:108"}, "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-d28e444f6b9a8453", "name": "Stray `console.log` in TS/JS \u2014 frontend/scripts/check-chat-prompt-i18n.js:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/scripts/check-chat-prompt-i18n.js:34"}, "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-322d27232acf2037", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SessionDropdown.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SessionDropdown.tsx:179"}, "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-99a5988d1ef66dcc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/AdminUserActivityCharts.tsx:402", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/AdminUserActivityCharts.tsx:402"}, "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-9e86a39c183fdfa0", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/ErrorBoundary.tsx:37", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/ErrorBoundary.tsx:37"}, "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-225dece852d9a8c1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/AppHeaderShell.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/AppHeaderShell.tsx:52"}, "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-76027b0923f3eebe", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/JsonLdScript.tsx:43", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/JsonLdScript.tsx:43"}, "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-b9a86e70916844a1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TextViewer/TextViewer.tsx:466", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TextViewer/TextViewer.tsx:466"}, "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-b8d3e027f27b7572", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Templates/QuestionTemplatesPanel.tsx:329", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Templates/QuestionTemplatesPanel.tsx:329"}, "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-4b85999db625c5e4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Profile/ProfileInfoSection.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Profile/ProfileInfoSection.tsx:55"}, "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-281cbfab2e015a4e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Chat/CitationCard.tsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Chat/CitationCard.tsx:41"}, "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-b244cb5f0a16461e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/Chat/MessageBubble.tsx:148", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/Chat/MessageBubble.tsx:148"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-96234b1a1192fcec", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Chat/SourcesStrip.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Chat/SourcesStrip.tsx:124"}, "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-cdf3c0f6724db890", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Chat/ChatArtifactCard.tsx:342", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Chat/ChatArtifactCard.tsx:342"}, "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-6bf606181d9708a4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/DashboardPageClient.tsx:605", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/DashboardPageClient.tsx:605"}, "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-e7f3dd2e282b1e39", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/marketing/MarketingArticleJsonLd.tsx:45", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/marketing/MarketingArticleJsonLd.tsx:45"}, "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-8a9b3e481d5b1151", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/ReasonBucketsDonut.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/ReasonBucketsDonut.tsx:53"}, "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-c86a4904e35f28c3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/RetentionTab.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/RetentionTab.tsx:81"}, "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-3eab0e57698f795f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/LayoutTranslation/LayoutTranslationDrawer.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/LayoutTranslation/LayoutTranslationDrawer.tsx:64"}, "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-66115c8f7e4b7463", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Diff/DocumentDiffPanel.tsx:457", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Diff/DocumentDiffPanel.tsx:457"}, "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-e0d766132fccef07", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/landing/HeroArtifact.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/landing/HeroArtifact.tsx:100"}, "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-ed2012a6dcc899c9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/CollectionList.tsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/CollectionList.tsx:37"}, "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-1f611dc79cafaadd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/CreateCollectionModal.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/CreateCollectionModal.tsx:181"}, "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-b1197665c88662d8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/SessionList.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/SessionList.tsx:38"}, "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-839db7e943262c8b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/CollectionSidebar.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/CollectionSidebar.tsx:33"}, "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-bfb075b1371d114b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/page.tsx:36", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/page.tsx:36"}, "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-36db90a6d2833040", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/about/page.tsx:21", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/about/page.tsx:21"}, "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-494544fa7ff8b6d8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/blog/page.tsx:24", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/blog/page.tsx:24"}, "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-324498e932e5c2e1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/blog/category/[category]/page.tsx:39", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/blog/category/[category]/page.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-547267327c1a1ec2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/blog/[slug]/page.tsx:68", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/blog/[slug]/page.tsx:68"}, "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-fdcf6f511e633013", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/demo/page.tsx:21", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/demo/page.tsx:21"}, "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-8a325713547ac107", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/contact/page.tsx:21", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/contact/page.tsx:21"}, "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-0db6f396144f55cb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/page.tsx:22", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/page.tsx:22"}, "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-5de1115e8b82f0f1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/real-estate/page.tsx:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/real-estate/page.tsx:52"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9e48795896a4240", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/students/page.tsx:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/students/page.tsx:52"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6a912168d155374c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/finance/page.tsx:64", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/finance/page.tsx:64"}, "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-bc91a647634535ad", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/compliance/page.tsx:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/compliance/page.tsx:52"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e008ebf32060a569", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/hr-contracts/page.tsx:47", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/hr-contracts/page.tsx:47"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e8a6788e9019b2b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/healthcare/page.tsx:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/healthcare/page.tsx:52"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-93f1a53566380b77", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/teachers/page.tsx:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/teachers/page.tsx:52"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c8d3070c4698012", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/consultants/page.tsx:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/consultants/page.tsx:52"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3072776f94e0ed73", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/lawyers/LawyersJsonLd.tsx:63", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/lawyers/LawyersJsonLd.tsx:63"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48dd2a7318d7b7b3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/d/[documentId]/DocumentReaderPageClient.tsx:293", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/d/[documentId]/DocumentReaderPageClient.tsx:293"}, "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-70615ace2de66277", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/billing/BillingPageClient.tsx:512", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/billing/BillingPageClient.tsx:512"}, "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-ba709bda6122df31", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/collections/[collectionId]/page.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/collections/[collectionId]/page.tsx:254"}, "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-22b4da5912821f48", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/imprint/page.tsx:21", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/imprint/page.tsx:21"}, "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-249159773e7f168c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/[locale]/page.tsx:64", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/[locale]/page.tsx:64"}, "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-21c304c8be4e024c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/trust/page.tsx:22", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/trust/page.tsx:22"}, "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-b03d4f456b23511b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/page.tsx:22", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/page.tsx:22"}, "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-427c323ba772d836", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/askyourpdf/page.tsx:57", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/askyourpdf/page.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-4616d366d5320deb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/chatpdf/page.tsx:57", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/chatpdf/page.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-eaa6c6d150c2d658", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/pdf-ai/page.tsx:57", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/pdf-ai/page.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-8ef95bbc06244a64", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/humata/page.tsx:55", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/humata/page.tsx:55"}, "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-1377158df0f43aea", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/notebooklm/page.tsx:56", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/notebooklm/page.tsx:56"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b110e91cea85f9c5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/tools/page.tsx:28", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/tools/page.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-a5450bd8fa5c91db", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/tools/word-counter/page.tsx:29", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/tools/word-counter/page.tsx:29"}, "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-a7b4cd413a0fe60d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/tools/word-counter/WordCounterClient.tsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/tools/word-counter/WordCounterClient.tsx:296"}, "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-5bd9f690b7452efa", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/tools/reading-time/page.tsx:29", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/tools/reading-time/page.tsx:29"}, "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-02bdb3393f816b60", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/terms/page.tsx:21", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/terms/page.tsx:21"}, "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-58be0c5c69ab6296", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/privacy/page.tsx:21", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/privacy/page.tsx:21"}, "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-c9913e45275a2b42", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/page.tsx:22", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/page.tsx:22"}, "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-59daec189cc23225", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/askyourpdf/page.tsx:43", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/askyourpdf/page.tsx:43"}, "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-d2133485232f769e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/chatpdf/page.tsx:47", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/chatpdf/page.tsx:47"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e65392ee56921714", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/pdf-ai/page.tsx:43", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/pdf-ai/page.tsx:43"}, "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-c1d258c2e09307e6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/humata/page.tsx:43", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/humata/page.tsx:43"}, "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-da758b0a323d9718", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/notebooklm/page.tsx:47", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/notebooklm/page.tsx:47"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a0cffc5de4620607", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/page.tsx:22", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/page.tsx:22"}, "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-7ed1e8efc9db0c62", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/multilingual/page.tsx:25", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/multilingual/page.tsx:25"}, "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-8adb31bfb4193a13", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/free-demo/page.tsx:25", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/free-demo/page.tsx:25"}, "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-326efadf1ded9a19", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/performance-modes/page.tsx:25", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/performance-modes/page.tsx:25"}, "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-0b3e39f4e9555e5d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/citations/page.tsx:25", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/citations/page.tsx:25"}, "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-d90f410b8729467d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/multi-format/page.tsx:25", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/multi-format/page.tsx:25"}, "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-45c613a25cc01735", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/pricing/page.tsx:27", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/pricing/page.tsx:27"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ee2c8bf22a87187e", "name": "Dockerfile runs as root: infra/minio/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: infra/minio/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c7085545d9cae6c0", "name": "Docker base image uses a mutable or implicit tag: minio/minio:latest", "shortDescription": {"text": "Docker base image uses a mutable or implicit tag: minio/minio:latest"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-806690b0cf7af634", "name": "Dockerfile runs as root: infra/qdrant/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: infra/qdrant/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-418922e429b4173c", "name": "Docker base image uses a mutable or implicit tag: qdrant/qdrant:latest", "shortDescription": {"text": "Docker base image uses a mutable or implicit tag: qdrant/qdrant:latest"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-08d27d332cd153b5", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12.7-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12.7-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8b6ce15e4a013193", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/JsonLdScript.tsx:43", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/JsonLdScript.tsx:43"}, "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-d342f077b3cf76aa", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/Chat/MessageBubble.tsx:148", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/Chat/MessageBubble.tsx:148"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-400f97fc685009b4", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/marketing/MarketingArticleJsonLd.tsx:45", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/marketing/MarketingArticleJsonLd.tsx:45"}, "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-f9768af17e76f1c2", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/page.tsx:36", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/page.tsx:36"}, "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-c3200b7be5932445", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/about/page.tsx:21", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/about/page.tsx:21"}, "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-c7fa8d6e002c44ff", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/blog/page.tsx:24", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/blog/page.tsx:24"}, "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-9fed7bf557bd233e", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/blog/category/[category]/page.tsx:39", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/blog/category/[category]/page.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-3a875e78083a06e0", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/blog/[slug]/page.tsx:68", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/blog/[slug]/page.tsx:68"}, "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-b1e5e187624fdb2e", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/demo/page.tsx:21", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/demo/page.tsx:21"}, "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-60c94e0cd1ad5380", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/contact/page.tsx:21", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/contact/page.tsx:21"}, "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-75f1f8686337d6e7", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/page.tsx:22", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/page.tsx:22"}, "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-ce7bb3a1fcea69a4", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/real-estate/page.tsx:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/real-estate/page.tsx:52"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-910cf502b60b0b70", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/students/page.tsx:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/students/page.tsx:52"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5f255bcba9a0048f", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/finance/page.tsx:64", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/finance/page.tsx:64"}, "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-92a2ebbb3f8718a1", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/compliance/page.tsx:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/compliance/page.tsx:52"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-102a2ec9df80fdb7", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/hr-contracts/page.tsx:47", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/hr-contracts/page.tsx:47"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fca4ab300b2d4110", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/healthcare/page.tsx:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/healthcare/page.tsx:52"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85fe9ce0c7faa58d", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/teachers/page.tsx:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/teachers/page.tsx:52"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-34f3f800903136f3", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/consultants/page.tsx:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/consultants/page.tsx:52"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f4383aff25922f7", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/lawyers/LawyersJsonLd.tsx:63", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/lawyers/LawyersJsonLd.tsx:63"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5da22a4bfd95bb36", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/imprint/page.tsx:21", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/imprint/page.tsx:21"}, "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-511b4d7f3c218574", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/[locale]/page.tsx:64", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/[locale]/page.tsx:64"}, "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-30c69d833c6c660e", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/trust/page.tsx:22", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/trust/page.tsx:22"}, "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-66d3ee4ed5ea50f9", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/page.tsx:22", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/page.tsx:22"}, "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-dec42e5acbe4c7c6", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/askyourpdf/page.tsx:57", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/askyourpdf/page.tsx:57"}, "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-8a2ca5a0c1919e2b", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/chatpdf/page.tsx:57", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/chatpdf/page.tsx:57"}, "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-937e8f62bcdcc2e0", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/pdf-ai/page.tsx:57", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/pdf-ai/page.tsx:57"}, "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-468ddae111ded52e", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/humata/page.tsx:55", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/humata/page.tsx:55"}, "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-736a96e899442adb", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/notebooklm/page.tsx:56", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/notebooklm/page.tsx:56"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-878671e3a72b355a", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/tools/page.tsx:28", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/tools/page.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-85f25cbb730285a5", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/tools/word-counter/page.tsx:29", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/tools/word-counter/page.tsx:29"}, "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-1cff41a3524da50a", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/tools/reading-time/page.tsx:29", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/tools/reading-time/page.tsx:29"}, "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-dafea5198e9f0005", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/terms/page.tsx:21", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/terms/page.tsx:21"}, "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-6b03f986d2600193", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/privacy/page.tsx:21", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/privacy/page.tsx:21"}, "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-a5df7cfafc362c89", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/page.tsx:22", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/page.tsx:22"}, "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-e446b32cab066187", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/askyourpdf/page.tsx:43", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/askyourpdf/page.tsx:43"}, "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-c2c4a7a18a56f52e", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/chatpdf/page.tsx:47", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/chatpdf/page.tsx:47"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-888811cff406d9a6", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/pdf-ai/page.tsx:43", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/pdf-ai/page.tsx:43"}, "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-c53e61384f49f000", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/humata/page.tsx:43", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/humata/page.tsx:43"}, "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-2576f228641b6fdd", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/notebooklm/page.tsx:47", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/notebooklm/page.tsx:47"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-74d777255ea6e208", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/page.tsx:22", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/page.tsx:22"}, "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-accc085fe9820c01", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/multilingual/page.tsx:25", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/multilingual/page.tsx:25"}, "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-63fad309f3e3b5cc", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/free-demo/page.tsx:25", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/free-demo/page.tsx:25"}, "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-8404f9730d39c345", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/performance-modes/page.tsx:25", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/performance-modes/page.tsx:25"}, "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-6af616abc569bb69", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/citations/page.tsx:25", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/citations/page.tsx:25"}, "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-fd389b21f5a77f8b", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/multi-format/page.tsx:25", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/multi-format/page.tsx:25"}, "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-226364e8c731c120", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/pricing/page.tsx:27", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/pricing/page.tsx:27"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b649383bc3d0eb0", "name": "Very large file: frontend/src/app/billing/BillingPageClient.tsx (1217 lines)", "shortDescription": {"text": "Very large file: frontend/src/app/billing/BillingPageClient.tsx (1217 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-a6e4d632a11142b3", "name": "Very large file: backend/app/api/admin.py (2503 lines)", "shortDescription": {"text": "Very large file: backend/app/api/admin.py (2503 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-83be73982133ce59", "name": "Very large file: backend/app/api/billing.py (1446 lines)", "shortDescription": {"text": "Very large file: backend/app/api/billing.py (1446 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-9cd57bbba479cadd", "name": "Very large file: backend/app/services/chat_service.py (2625 lines)", "shortDescription": {"text": "Very large file: backend/app/services/chat_service.py (2625 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-e3f9312ff0b79dbe", "name": "Very large file: backend/app/services/document_brief_service.py (1885 lines)", "shortDescription": {"text": "Very large file: backend/app/services/document_brief_service.py (1885 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": "71 tests / 488 src (ratio 0.15)."}, "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 118 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 57 placeholder/mock markers across 30 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-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-82ce58fa898b7a1e", "name": "Agent authority lacks a verifier contract: .claude/commands/vuln-hunt.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/vuln-hunt.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-f0eeb2c042582b42", "name": "Commented-code block (6 lines) in frontend/next.config.mjs:30", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/next.config.mjs: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-a85a1406861806eb", "name": "Commented-code block (7 lines) in frontend/src/components/CookieConsentBanner.tsx:31", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/CookieConsentBanner.tsx:31"}, "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-18285893603f610e", "name": "Legacy-named symbol `confusing_copy` in frontend/src/components/FeedbackButton.tsx:90", "shortDescription": {"text": "Legacy-named symbol `confusing_copy` in frontend/src/components/FeedbackButton.tsx:90"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6054b05c096380c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/TextViewer/TextViewer.tsx:215", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/TextViewer/TextViewer.tsx:215"}, "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-9a04ca317b12a626", "name": "Commented-code block (5 lines) in frontend/src/components/Chat/MessageBubble.tsx:88", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/Chat/MessageBubble.tsx:88"}, "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-2305231c9b9c0ab8", "name": "Commented-code block (13 lines) in frontend/src/components/Chat/ChatPanel.tsx:437", "shortDescription": {"text": "Commented-code block (13 lines) in frontend/src/components/Chat/ChatPanel.tsx:437"}, "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-6d6b79a5413e6c83", "name": "Commented-code block (7 lines) in frontend/src/app/layout.tsx:70", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/app/layout.tsx:70"}, "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-82685709260a6472", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/contact/route.ts:98", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/contact/route.ts:98"}, "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-a6331e198552f6e3", "name": "Commented-code block (6 lines) in frontend/src/app/api/proxy/[...path]/route.ts:79", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/app/api/proxy/[...path]/route.ts:79"}, "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-8dcbd3d483f9abda", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/indexnow/route.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/indexnow/route.ts:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8dd93d6fa2d91478", "name": "Legacy-named symbol `CspReportLegacy` in frontend/src/app/api/csp-report/route.ts:84", "shortDescription": {"text": "Legacy-named symbol `CspReportLegacy` in frontend/src/app/api/csp-report/route.ts:84"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5548134d7f997e6", "name": "Commented-code block (9 lines) in frontend/src/app/api/csp-report/route.ts:30", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/app/api/csp-report/route.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-d9f299443433c10b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/api.ts:125", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/api.ts:125"}, "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-f1d7581203908eb4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/auth.ts:91", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/auth.ts:91"}, "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-027b72c1aecef345", "name": "Commented-code block (5 lines) in frontend/src/lib/errorCopy.ts:462", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/errorCopy.ts:462"}, "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-84628d7c6f846951", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/sse.ts:174", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/sse.ts:174"}, "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-c1572bde189e20ff", "name": "Commented-code block (5 lines) in frontend/src/lib/useChatStream.ts:118", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/useChatStream.ts:118"}, "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-d386afed62e8c6db", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/authAdapter.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/authAdapter.ts: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-ad3593511289da5f", "name": "Commented-code block (6 lines) in frontend/src/store/index.ts:296", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/store/index.ts:296"}, "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-769a68773e2ebd01", "name": "Legacy-named symbol `u_old` in backend/tests/test_admin_retention.py:120", "shortDescription": {"text": "Legacy-named symbol `u_old` in backend/tests/test_admin_retention.py:120"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-229bec7585d69a36", "name": "Commented-code block (5 lines) in backend/tests/test_proxy_ip_verification.py:211", "shortDescription": {"text": "Commented-code block (5 lines) in backend/tests/test_proxy_ip_verification.py:211"}, "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-70c80fea72ce4f3a", "name": "Legacy-named symbol `test_ingest_url_blocked_fetch_reasons_share_safe_error_copy` in backend/tests/test_error_taxonomy.p", "shortDescription": {"text": "Legacy-named symbol `test_ingest_url_blocked_fetch_reasons_share_safe_error_copy` in backend/tests/test_error_taxonomy.py:329"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b81bc1a9f92ac48", "name": "Legacy-named symbol `sub_old` in backend/tests/test_billing_logic.py:124", "shortDescription": {"text": "Legacy-named symbol `sub_old` in backend/tests/test_billing_logic.py:124"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-44cf7aec6421598d", "name": "Legacy-named symbol `locked_copy` in backend/tests/test_billing_cancel.py:427", "shortDescription": {"text": "Legacy-named symbol `locked_copy` in backend/tests/test_billing_cancel.py:427"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee7054b44517607c", "name": "Commented-code block (5 lines) in backend/scripts/find_low_quality_docs.py:65", "shortDescription": {"text": "Commented-code block (5 lines) in backend/scripts/find_low_quality_docs.py:65"}, "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-b84cb775432d6add", "name": "Legacy-named symbol `document_brief_v1` in backend/app/models/tables.py:648", "shortDescription": {"text": "Legacy-named symbol `document_brief_v1` in backend/app/models/tables.py:648"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-620f7c59abf2dcbe", "name": "Commented-code block (5 lines) in backend/app/api/billing.py:911", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/api/billing.py:911"}, "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-aef4d6aaab41260b", "name": "Commented-code block (6 lines) in backend/app/workers/parse_worker.py:145", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/workers/parse_worker.py:145"}, "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-5d4a7a903612b71e", "name": "Legacy-named symbol `document_brief_v1` in backend/app/services/summary_service.py:27", "shortDescription": {"text": "Legacy-named symbol `document_brief_v1` in backend/app/services/summary_service.py:27"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a1edfef846e1084", "name": "Commented-code block (5 lines) in backend/app/services/chat_service.py:1328", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/services/chat_service.py:1328"}, "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-3f0a62556295e0a9", "name": "Commented-code block (5 lines) in backend/app/services/export_service.py:13", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/services/export_service.py: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-6354a8c89bc161f5", "name": "Commented-code block (5 lines) in backend/app/services/parse_service.py:89", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/services/parse_service.py:89"}, "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-82110f38ebbeafd1", "name": "Legacy-named symbol `summary_map_reduce_v2` in backend/app/services/document_brief_service.py:34", "shortDescription": {"text": "Legacy-named symbol `summary_map_reduce_v2` in backend/app/services/document_brief_service.py:34"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aac2baece1e8b8b0", "name": "Legacy-named symbol `document_brief_v1` in backend/alembic/versions/20260507_0026_add_document_briefs.py:21", "shortDescription": {"text": "Legacy-named symbol `document_brief_v1` in backend/alembic/versions/20260507_0026_add_document_briefs.py:21"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0b7578dd2a289b6", "name": "26 env vars used in code but missing from .env.example", "shortDescription": {"text": "26 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BACKEND_INTERNAL_URL`, `CONTACT_TO`, `DATABASE_PUBLIC_URL`, `DB`, `EMAIL_FROM`, `ENVIRONMENT`, `GITHUB_SHA`, `MICROSOFT_CLIENT_ID` + 18 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}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/api/tables.py:scan_document_tables, backend/app/api/tables.py:list_document_tables, backend/app/api/extractions.py:list_document_extractions, backend/app/api/question_templates.py:list_document_question_template_runs\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/api/tables.py:export_document_tables, backend/app/api/tables.py:export_document_table\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/api/document_diffs.py:get_document_diff, backend/app/api/document_jobs.py:get_document_job, backend/app/api/question_templates.py:get_question_template_run\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-39aeae0d5916bdbe", "name": "Dangling fetch: GET /api/proxy/api/credits/balance (frontend/src/components/CreditsDisplay.tsx:24)", "shortDescription": {"text": "Dangling fetch: GET /api/proxy/api/credits/balance (frontend/src/components/CreditsDisplay.tsx:24)"}, "fullDescription": {"text": "`frontend/src/components/CreditsDisplay.tsx:24` calls `GET /api/proxy/api/credits/balance` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/proxy/api/credits/balance`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3751cba31914a742", "name": "Dangling fetch: GET /api/proxy/api/users/profile (frontend/src/components/CreditsDisplay.tsx:39)", "shortDescription": {"text": "Dangling fetch: GET /api/proxy/api/users/profile (frontend/src/components/CreditsDisplay.tsx:39)"}, "fullDescription": {"text": "`frontend/src/components/CreditsDisplay.tsx:39` calls `GET /api/proxy/api/users/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/proxy/api/users/profile`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2600e5f5f5d6b6ba", "name": "Dangling fetch: POST /api/contact (frontend/src/app/contact/ContactPageClient.tsx:48)", "shortDescription": {"text": "Dangling fetch: POST /api/contact (frontend/src/app/contact/ContactPageClient.tsx:48)"}, "fullDescription": {"text": "`frontend/src/app/contact/ContactPageClient.tsx:48` calls `POST /api/contact` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/contact`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1399cf5c5f331482", "name": "Dangling fetch: POST https://api.resend.com/emails (frontend/src/app/api/contact/route.ts:98)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (frontend/src/app/api/contact/route.ts:98)"}, "fullDescription": {"text": "`frontend/src/app/api/contact/route.ts:98` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b6425708179825e3", "name": "Dangling fetch: GET /api/proxy/api/billing/products (frontend/src/app/billing/BillingPageClient.tsx:189)", "shortDescription": {"text": "Dangling fetch: GET /api/proxy/api/billing/products (frontend/src/app/billing/BillingPageClient.tsx:189)"}, "fullDescription": {"text": "`frontend/src/app/billing/BillingPageClient.tsx:189` calls `GET /api/proxy/api/billing/products` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/proxy/api/billing/products`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fae96761306ea7da", "name": "Dangling fetch: POST /api/proxy/api/billing/checkout?pack_id=${packId} (frontend/src/app/billing/BillingPageClient.tsx:2", "shortDescription": {"text": "Dangling fetch: POST /api/proxy/api/billing/checkout?pack_id=${packId} (frontend/src/app/billing/BillingPageClient.tsx:211)"}, "fullDescription": {"text": "`frontend/src/app/billing/BillingPageClient.tsx:211` calls `POST /api/proxy/api/billing/checkout?pack_id=${packId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/proxy/api/billing/checkout`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2a5b1eda24b75db", "name": "Dangling fetch: GET /api/upload-token (frontend/src/lib/api.ts:125)", "shortDescription": {"text": "Dangling fetch: GET /api/upload-token (frontend/src/lib/api.ts:125)"}, "fullDescription": {"text": "`frontend/src/lib/api.ts:125` calls `GET /api/upload-token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d3323129d6f14adf", "name": "Dangling fetch: POST https://api.resend.com/emails (frontend/src/lib/auth.ts:91)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (frontend/src/lib/auth.ts:91)"}, "fullDescription": {"text": "`frontend/src/lib/auth.ts:91` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-10be1a04947ea15a", "name": "Dangling fetch: POST /api/proxy/api/events (frontend/src/lib/analytics.ts:17)", "shortDescription": {"text": "Dangling fetch: POST /api/proxy/api/events (frontend/src/lib/analytics.ts:17)"}, "fullDescription": {"text": "`frontend/src/lib/analytics.ts:17` calls `POST /api/proxy/api/events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/proxy/api/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7e35de536b500b74", "name": "Unused endpoint: GET /chunks/{chunk_id}", "shortDescription": {"text": "Unused endpoint: GET /chunks/{chunk_id}"}, "fullDescription": {"text": "`backend/app/api/chunks.py` declares `GET /chunks/{chunk_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ed839d590a8e348", "name": "Unused endpoint: POST /api/sessions/{session_id}/share", "shortDescription": {"text": "Unused endpoint: POST /api/sessions/{session_id}/share"}, "fullDescription": {"text": "`backend/app/api/sharing.py` declares `POST /api/sessions/{session_id}/share` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4afe3af1bf786259", "name": "Unused endpoint: DELETE /api/sessions/{session_id}/share", "shortDescription": {"text": "Unused endpoint: DELETE /api/sessions/{session_id}/share"}, "fullDescription": {"text": "`backend/app/api/sharing.py` declares `DELETE /api/sessions/{session_id}/share` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78958125ae705843", "name": "Unused endpoint: GET /api/shared/{share_token}", "shortDescription": {"text": "Unused endpoint: GET /api/shared/{share_token}"}, "fullDescription": {"text": "`backend/app/api/sharing.py` declares `GET /api/shared/{share_token}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/app/api/feedback.py` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-231cc5b9bdcf1283", "name": "Unused endpoint: POST /documents/{document_id}/tables/scan", "shortDescription": {"text": "Unused endpoint: POST /documents/{document_id}/tables/scan"}, "fullDescription": {"text": "`backend/app/api/tables.py` declares `POST /documents/{document_id}/tables/scan` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-906a8dcdc1fc74d5", "name": "Unused endpoint: POST /document-tables/{table_id}/reconstruct", "shortDescription": {"text": "Unused endpoint: POST /document-tables/{table_id}/reconstruct"}, "fullDescription": {"text": "`backend/app/api/tables.py` declares `POST /document-tables/{table_id}/reconstruct` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fb456b8c2f17be9", "name": "Unused endpoint: GET /documents/{document_id}/tables", "shortDescription": {"text": "Unused endpoint: GET /documents/{document_id}/tables"}, "fullDescription": {"text": "`backend/app/api/tables.py` declares `GET /documents/{document_id}/tables` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ebc863a8616bdaaf", "name": "Unused endpoint: GET /documents/{document_id}/tables/export", "shortDescription": {"text": "Unused endpoint: GET /documents/{document_id}/tables/export"}, "fullDescription": {"text": "`backend/app/api/tables.py` declares `GET /documents/{document_id}/tables/export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a81ec534949e37c0", "name": "Unused endpoint: GET /document-table-scans/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /document-table-scans/{job_id}"}, "fullDescription": {"text": "`backend/app/api/tables.py` declares `GET /document-table-scans/{job_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3cf462f95b14fd05", "name": "Unused endpoint: GET /document-tables/{table_id}/export", "shortDescription": {"text": "Unused endpoint: GET /document-tables/{table_id}/export"}, "fullDescription": {"text": "`backend/app/api/tables.py` declares `GET /document-tables/{table_id}/export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1bca8100a44f7f25", "name": "Unused endpoint: POST /users", "shortDescription": {"text": "Unused endpoint: POST /users"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `POST /users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d18411a066b7e2c1", "name": "Unused endpoint: GET /users/{user_id}", "shortDescription": {"text": "Unused endpoint: GET /users/{user_id}"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `GET /users/{user_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0466faf660a7e2fc", "name": "Unused endpoint: GET /users/by-email/{email}", "shortDescription": {"text": "Unused endpoint: GET /users/by-email/{email}"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `GET /users/by-email/{email}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b76c13b28ad04e13", "name": "Unused endpoint: GET /users/by-account/{provider}/{provider_account_id}", "shortDescription": {"text": "Unused endpoint: GET /users/by-account/{provider}/{provider_account_id}"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `GET /users/by-account/{provider}/{provider_account_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d07acca647618197", "name": "Unused endpoint: PUT /users/{user_id}", "shortDescription": {"text": "Unused endpoint: PUT /users/{user_id}"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `PUT /users/{user_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fecd99fa2d3d6078", "name": "Unused endpoint: DELETE /users/{user_id}", "shortDescription": {"text": "Unused endpoint: DELETE /users/{user_id}"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `DELETE /users/{user_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c04406fe463e162f", "name": "Unused endpoint: POST /accounts", "shortDescription": {"text": "Unused endpoint: POST /accounts"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `POST /accounts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8b30199bbd10358", "name": "Unused endpoint: DELETE /accounts/{provider}/{provider_account_id}", "shortDescription": {"text": "Unused endpoint: DELETE /accounts/{provider}/{provider_account_id}"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `DELETE /accounts/{provider}/{provider_account_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48b2276617b76f9a", "name": "Unused endpoint: POST /verification-tokens", "shortDescription": {"text": "Unused endpoint: POST /verification-tokens"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `POST /verification-tokens` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1646dc7417be05e0", "name": "Unused endpoint: POST /verification-tokens/use", "shortDescription": {"text": "Unused endpoint: POST /verification-tokens/use"}, "fullDescription": {"text": "`backend/app/api/auth.py` declares `POST /verification-tokens/use` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/app/api/collections.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-68fbf5570787c70d", "name": "Unused endpoint: GET /{collection_id}", "shortDescription": {"text": "Unused endpoint: GET /{collection_id}"}, "fullDescription": {"text": "`backend/app/api/collections.py` declares `GET /{collection_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b88035bbb53fadec", "name": "Unused endpoint: DELETE /{collection_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{collection_id}"}, "fullDescription": {"text": "`backend/app/api/collections.py` declares `DELETE /{collection_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-21f239106a095b6a", "name": "Unused endpoint: POST /{collection_id}/documents", "shortDescription": {"text": "Unused endpoint: POST /{collection_id}/documents"}, "fullDescription": {"text": "`backend/app/api/collections.py` declares `POST /{collection_id}/documents` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f649216de490f7a8", "name": "Unused endpoint: DELETE /{collection_id}/documents/{document_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{collection_id}/documents/{document_id}"}, "fullDescription": {"text": "`backend/app/api/collections.py` declares `DELETE /{collection_id}/documents/{document_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e0dffc8fdd44ba7", "name": "Unused endpoint: POST /{collection_id}/sessions", "shortDescription": {"text": "Unused endpoint: POST /{collection_id}/sessions"}, "fullDescription": {"text": "`backend/app/api/collections.py` declares `POST /{collection_id}/sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-47ccf136d127e0cc", "name": "Unused endpoint: GET /{collection_id}/sessions", "shortDescription": {"text": "Unused endpoint: GET /{collection_id}/sessions"}, "fullDescription": {"text": "`backend/app/api/collections.py` declares `GET /{collection_id}/sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac2f552bf9d967ce", "name": "Unused endpoint: GET /overview", "shortDescription": {"text": "Unused endpoint: GET /overview"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /overview` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-db5b5837abddb8b5", "name": "Unused endpoint: GET /trends", "shortDescription": {"text": "Unused endpoint: GET /trends"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /trends` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3558a78a26ebdf7e", "name": "Unused endpoint: GET /breakdowns", "shortDescription": {"text": "Unused endpoint: GET /breakdowns"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /breakdowns` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c72e441f29f4c4e2", "name": "Unused endpoint: GET /user-activity", "shortDescription": {"text": "Unused endpoint: GET /user-activity"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /user-activity` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0399243c128aed5", "name": "Unused endpoint: GET /retention", "shortDescription": {"text": "Unused endpoint: GET /retention"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /retention` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de9fcb1422a0afb6", "name": "Unused endpoint: GET /churn", "shortDescription": {"text": "Unused endpoint: GET /churn"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /churn` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dfe1d9e78120fad3", "name": "Unused endpoint: GET /billing-health", "shortDescription": {"text": "Unused endpoint: GET /billing-health"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /billing-health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e03a6de6e7f5fe8", "name": "Unused endpoint: GET /funnel", "shortDescription": {"text": "Unused endpoint: GET /funnel"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /funnel` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c5d46a57becfbd3f", "name": "Unused endpoint: GET /rag-quality", "shortDescription": {"text": "Unused endpoint: GET /rag-quality"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /rag-quality` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4314736ef0c8b7f8", "name": "Unused endpoint: GET /recent-users", "shortDescription": {"text": "Unused endpoint: GET /recent-users"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /recent-users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a9ce3d8441000e9b", "name": "Unused endpoint: GET /top-users", "shortDescription": {"text": "Unused endpoint: GET /top-users"}, "fullDescription": {"text": "`backend/app/api/admin.py` declares `GET /top-users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f106c7253fc15ffb", "name": "Unused endpoint: POST /document-diffs", "shortDescription": {"text": "Unused endpoint: POST /document-diffs"}, "fullDescription": {"text": "`backend/app/api/document_diffs.py` declares `POST /document-diffs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ecb497d1a4511694", "name": "Unused endpoint: GET /document-diffs", "shortDescription": {"text": "Unused endpoint: GET /document-diffs"}, "fullDescription": {"text": "`backend/app/api/document_diffs.py` declares `GET /document-diffs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b7ba387ab8dac09", "name": "Unused endpoint: GET /document-diffs/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /document-diffs/{job_id}"}, "fullDescription": {"text": "`backend/app/api/document_diffs.py` declares `GET /document-diffs/{job_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-446599339af2dfbc", "name": "Unused endpoint: GET /document-diffs/{job_id}/export", "shortDescription": {"text": "Unused endpoint: GET /document-diffs/{job_id}/export"}, "fullDescription": {"text": "`backend/app/api/document_diffs.py` declares `GET /document-diffs/{job_id}/export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-24d2fb2e01efb33b", "name": "Unused endpoint: GET /document-jobs/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /document-jobs/{job_id}"}, "fullDescription": {"text": "`backend/app/api/document_jobs.py` declares `GET /document-jobs/{job_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`backend/app/api/users.py` declares `GET /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2595b39638e5c045", "name": "Unused endpoint: GET /profile", "shortDescription": {"text": "Unused endpoint: GET /profile"}, "fullDescription": {"text": "`backend/app/api/users.py` declares `GET /profile` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc75577108e5e2a9", "name": "Unused endpoint: GET /usage-breakdown", "shortDescription": {"text": "Unused endpoint: GET /usage-breakdown"}, "fullDescription": {"text": "`backend/app/api/users.py` declares `GET /usage-breakdown` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7244774f57779581", "name": "Unused endpoint: GET /me/export", "shortDescription": {"text": "Unused endpoint: GET /me/export"}, "fullDescription": {"text": "`backend/app/api/users.py` declares `GET /me/export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-380780ae47e04514", "name": "Unused endpoint: DELETE /me", "shortDescription": {"text": "Unused endpoint: DELETE /me"}, "fullDescription": {"text": "`backend/app/api/users.py` declares `DELETE /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af8d7d67290dbbcc", "name": "Unused endpoint: GET /api/sessions/{session_id}/export", "shortDescription": {"text": "Unused endpoint: GET /api/sessions/{session_id}/export"}, "fullDescription": {"text": "`backend/app/api/export.py` declares `GET /api/sessions/{session_id}/export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18547"}, "properties": {"repository": "Rswcf/DocTalk", "repoUrl": "https://github.com/Rswcf/DocTalk", "branch": "main"}, "results": [{"ruleId": "scanner-6165713588c087b7", "level": "note", "message": {"text": "Possibly dead Python function: work"}, "properties": {"repobilityId": "c5b0e9acf413d08f", "scanner": "scanner-primary", "fingerprint": "6165713588c087b7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/scripts/fill_locale_translations.py:85"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0249093e28256eec", "level": "note", "message": {"text": "Possibly dead Python function: run_mode"}, "properties": {"repobilityId": "c4c404d654034d79", "scanner": "scanner-primary", "fingerprint": "0249093e28256eec", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/replay_cases.py:189"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a9f118ca675787a8", "level": "note", "message": {"text": "Possibly dead Python function: verify_adapter_secret"}, "properties": {"repobilityId": "a90481c2bd2a79e9", "scanner": "scanner-primary", "fingerprint": "a9f118ca675787a8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/auth.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0b4902c63b1637f7", "level": "note", "message": {"text": "Possibly dead Python function: generate_summary_sync"}, "properties": {"repobilityId": "92d8db4adcfeb9a7", "scanner": "scanner-primary", "fingerprint": "0b4902c63b1637f7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/summary_service.py:428"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6274d4f74cb78ce4", "level": "note", "message": {"text": "Possibly dead Python function: health_check"}, "properties": {"repobilityId": "a08f81cc62fccf65", "scanner": "scanner-primary", "fingerprint": "6274d4f74cb78ce4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/storage_service.py:84"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2dd5fc38214cb414", "level": "note", "message": {"text": "Possibly dead Python function: scan_document_tables"}, "properties": {"repobilityId": "ce3294d392326a49", "scanner": "scanner-primary", "fingerprint": "2dd5fc38214cb414", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/table_service.py:792"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-94aa8172d9648740", "level": "note", "message": {"text": "Possibly dead Python function: require_auth"}, "properties": {"repobilityId": "d7855475dea79341", "scanner": "scanner-primary", "fingerprint": "94aa8172d9648740", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/core/deps.py:67"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-41263d0e8f081afc", "level": "note", "message": {"text": "Possibly dead Python function: require_admin"}, "properties": {"repobilityId": "3c06db2e25566bf7", "scanner": "scanner-primary", "fingerprint": "41263d0e8f081afc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/core/deps.py:76"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3e186984c7e0d930", "level": "note", "message": {"text": "Possibly dead Python function: cache_delete_pattern"}, "properties": {"repobilityId": "47b28b70f92c9b4f", "scanner": "scanner-primary", "fingerprint": "3e186984c7e0d930", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/core/cache.py:102"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ebf3d0f26f5eaa37", "level": "note", "message": {"text": "Possibly dead Python function: do_run_migrations"}, "properties": {"repobilityId": "087acb17722cfd2f", "scanner": "scanner-primary", "fingerprint": "ebf3d0f26f5eaa37", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/env.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8b72eb6676cb446f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/scripts/check-public-i18n.js:108"}, "properties": {"repobilityId": "c8ff3a295c9efe5c", "scanner": "scanner-primary", "fingerprint": "8b72eb6676cb446f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d28e444f6b9a8453", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/scripts/check-chat-prompt-i18n.js:34"}, "properties": {"repobilityId": "6c28abeecd813657", "scanner": "scanner-primary", "fingerprint": "d28e444f6b9a8453", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-322d27232acf2037", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SessionDropdown.tsx:179"}, "properties": {"repobilityId": "2fefd66629a2f19f", "scanner": "scanner-primary", "fingerprint": "322d27232acf2037", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99a5988d1ef66dcc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/AdminUserActivityCharts.tsx:402"}, "properties": {"repobilityId": "469c4c4b410e26f7", "scanner": "scanner-primary", "fingerprint": "99a5988d1ef66dcc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e86a39c183fdfa0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/ErrorBoundary.tsx:37"}, "properties": {"repobilityId": "fed5fea1ad4204b4", "scanner": "scanner-primary", "fingerprint": "9e86a39c183fdfa0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-225dece852d9a8c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/AppHeaderShell.tsx:52"}, "properties": {"repobilityId": "89403436fbf44653", "scanner": "scanner-primary", "fingerprint": "225dece852d9a8c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76027b0923f3eebe", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/JsonLdScript.tsx:43"}, "properties": {"repobilityId": "6661b70f78d1205a", "scanner": "scanner-primary", "fingerprint": "76027b0923f3eebe", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b9a86e70916844a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TextViewer/TextViewer.tsx:466"}, "properties": {"repobilityId": "705a231872ab5f15", "scanner": "scanner-primary", "fingerprint": "b9a86e70916844a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8d3e027f27b7572", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Templates/QuestionTemplatesPanel.tsx:329"}, "properties": {"repobilityId": "16fbd6cd3907c4da", "scanner": "scanner-primary", "fingerprint": "b8d3e027f27b7572", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b85999db625c5e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Profile/ProfileInfoSection.tsx:55"}, "properties": {"repobilityId": "b1ef3e7a64602fd5", "scanner": "scanner-primary", "fingerprint": "4b85999db625c5e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-281cbfab2e015a4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Chat/CitationCard.tsx:41"}, "properties": {"repobilityId": "ce005ba7fcbf5451", "scanner": "scanner-primary", "fingerprint": "281cbfab2e015a4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b244cb5f0a16461e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/Chat/MessageBubble.tsx:148"}, "properties": {"repobilityId": "2e4241dfdf41921b", "scanner": "scanner-primary", "fingerprint": "b244cb5f0a16461e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-96234b1a1192fcec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Chat/SourcesStrip.tsx:124"}, "properties": {"repobilityId": "cbb98de22d2c175c", "scanner": "scanner-primary", "fingerprint": "96234b1a1192fcec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cdf3c0f6724db890", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Chat/ChatArtifactCard.tsx:342"}, "properties": {"repobilityId": "b7621b7336bfdd40", "scanner": "scanner-primary", "fingerprint": "cdf3c0f6724db890", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6bf606181d9708a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dashboard/DashboardPageClient.tsx:605"}, "properties": {"repobilityId": "6310f09532cc0382", "scanner": "scanner-primary", "fingerprint": "6bf606181d9708a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7f3dd2e282b1e39", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/marketing/MarketingArticleJsonLd.tsx:45"}, "properties": {"repobilityId": "df12d7ed583f3352", "scanner": "scanner-primary", "fingerprint": "e7f3dd2e282b1e39", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8a9b3e481d5b1151", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/ReasonBucketsDonut.tsx:53"}, "properties": {"repobilityId": "4202adbec8039895", "scanner": "scanner-primary", "fingerprint": "8a9b3e481d5b1151", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c86a4904e35f28c3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin/RetentionTab.tsx:81"}, "properties": {"repobilityId": "781676f8ff9e429e", "scanner": "scanner-primary", "fingerprint": "c86a4904e35f28c3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3eab0e57698f795f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/LayoutTranslation/LayoutTranslationDrawer.tsx:64"}, "properties": {"repobilityId": "9bc429f68e193546", "scanner": "scanner-primary", "fingerprint": "3eab0e57698f795f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-66115c8f7e4b7463", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Diff/DocumentDiffPanel.tsx:457"}, "properties": {"repobilityId": "0fd1a388965e0fd1", "scanner": "scanner-primary", "fingerprint": "66115c8f7e4b7463", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0d766132fccef07", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/landing/HeroArtifact.tsx:100"}, "properties": {"repobilityId": "2733583c20b1c241", "scanner": "scanner-primary", "fingerprint": "e0d766132fccef07", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed2012a6dcc899c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/CollectionList.tsx:37"}, "properties": {"repobilityId": "09365db9c020ef82", "scanner": "scanner-primary", "fingerprint": "ed2012a6dcc899c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f611dc79cafaadd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/CreateCollectionModal.tsx:181"}, "properties": {"repobilityId": "242bdfe0ea6db013", "scanner": "scanner-primary", "fingerprint": "1f611dc79cafaadd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1197665c88662d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/SessionList.tsx:38"}, "properties": {"repobilityId": "369b5c3bfa79e7d5", "scanner": "scanner-primary", "fingerprint": "b1197665c88662d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-839db7e943262c8b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Collections/CollectionSidebar.tsx:33"}, "properties": {"repobilityId": "9d1ef277625e625d", "scanner": "scanner-primary", "fingerprint": "839db7e943262c8b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bfb075b1371d114b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/page.tsx:36"}, "properties": {"repobilityId": "2bb0766c141d59b5", "scanner": "scanner-primary", "fingerprint": "bfb075b1371d114b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-36db90a6d2833040", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/about/page.tsx:21"}, "properties": {"repobilityId": "cd8da1ea66b36915", "scanner": "scanner-primary", "fingerprint": "36db90a6d2833040", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-494544fa7ff8b6d8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/blog/page.tsx:24"}, "properties": {"repobilityId": "a14a11e203aa8223", "scanner": "scanner-primary", "fingerprint": "494544fa7ff8b6d8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-324498e932e5c2e1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/blog/category/[category]/page.tsx:39"}, "properties": {"repobilityId": "8ae381a0a8e36db2", "scanner": "scanner-primary", "fingerprint": "324498e932e5c2e1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-547267327c1a1ec2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/blog/[slug]/page.tsx:68"}, "properties": {"repobilityId": "71d64e4878cff484", "scanner": "scanner-primary", "fingerprint": "547267327c1a1ec2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fdcf6f511e633013", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/demo/page.tsx:21"}, "properties": {"repobilityId": "ac4f133866d30813", "scanner": "scanner-primary", "fingerprint": "fdcf6f511e633013", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8a325713547ac107", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/contact/page.tsx:21"}, "properties": {"repobilityId": "c19166687a91a950", "scanner": "scanner-primary", "fingerprint": "8a325713547ac107", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0db6f396144f55cb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/page.tsx:22"}, "properties": {"repobilityId": "346d7f4e82151d9e", "scanner": "scanner-primary", "fingerprint": "0db6f396144f55cb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5de1115e8b82f0f1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/real-estate/page.tsx:52"}, "properties": {"repobilityId": "fe826987987121c9", "scanner": "scanner-primary", "fingerprint": "5de1115e8b82f0f1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b9e48795896a4240", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/students/page.tsx:52"}, "properties": {"repobilityId": "cc5ef7a6f4cb2928", "scanner": "scanner-primary", "fingerprint": "b9e48795896a4240", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6a912168d155374c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/finance/page.tsx:64"}, "properties": {"repobilityId": "6dab341acad9e833", "scanner": "scanner-primary", "fingerprint": "6a912168d155374c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bc91a647634535ad", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/compliance/page.tsx:52"}, "properties": {"repobilityId": "35ed92a616af48e6", "scanner": "scanner-primary", "fingerprint": "bc91a647634535ad", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e008ebf32060a569", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/hr-contracts/page.tsx:47"}, "properties": {"repobilityId": "341a3beb126db16d", "scanner": "scanner-primary", "fingerprint": "e008ebf32060a569", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6e8a6788e9019b2b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/healthcare/page.tsx:52"}, "properties": {"repobilityId": "7c601592fb012133", "scanner": "scanner-primary", "fingerprint": "6e8a6788e9019b2b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-93f1a53566380b77", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/teachers/page.tsx:52"}, "properties": {"repobilityId": "37075167a43ad2d3", "scanner": "scanner-primary", "fingerprint": "93f1a53566380b77", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8c8d3070c4698012", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/consultants/page.tsx:52"}, "properties": {"repobilityId": "63512950a4b9f576", "scanner": "scanner-primary", "fingerprint": "8c8d3070c4698012", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3072776f94e0ed73", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/use-cases/lawyers/LawyersJsonLd.tsx:63"}, "properties": {"repobilityId": "5eb0f2e5fa0c7df5", "scanner": "scanner-primary", "fingerprint": "3072776f94e0ed73", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-48dd2a7318d7b7b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/d/[documentId]/DocumentReaderPageClient.tsx:293"}, "properties": {"repobilityId": "258ebd606495315d", "scanner": "scanner-primary", "fingerprint": "48dd2a7318d7b7b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70615ace2de66277", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/billing/BillingPageClient.tsx:512"}, "properties": {"repobilityId": "1a360112f2112f95", "scanner": "scanner-primary", "fingerprint": "70615ace2de66277", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba709bda6122df31", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/collections/[collectionId]/page.tsx:254"}, "properties": {"repobilityId": "a49d62dd53ce1b16", "scanner": "scanner-primary", "fingerprint": "ba709bda6122df31", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22b4da5912821f48", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/imprint/page.tsx:21"}, "properties": {"repobilityId": "c8a12ed5f8f8fa37", "scanner": "scanner-primary", "fingerprint": "22b4da5912821f48", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-249159773e7f168c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/[locale]/page.tsx:64"}, "properties": {"repobilityId": "8b51466fe2d13711", "scanner": "scanner-primary", "fingerprint": "249159773e7f168c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-21c304c8be4e024c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/trust/page.tsx:22"}, "properties": {"repobilityId": "6b38c829721b5073", "scanner": "scanner-primary", "fingerprint": "21c304c8be4e024c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b03d4f456b23511b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/page.tsx:22"}, "properties": {"repobilityId": "43a6398a81be66de", "scanner": "scanner-primary", "fingerprint": "b03d4f456b23511b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-427c323ba772d836", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/askyourpdf/page.tsx:57"}, "properties": {"repobilityId": "7748d1fed6d877be", "scanner": "scanner-primary", "fingerprint": "427c323ba772d836", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4616d366d5320deb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/chatpdf/page.tsx:57"}, "properties": {"repobilityId": "625803e09cb9bd20", "scanner": "scanner-primary", "fingerprint": "4616d366d5320deb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-eaa6c6d150c2d658", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/pdf-ai/page.tsx:57"}, "properties": {"repobilityId": "20011ddcb1bd11f6", "scanner": "scanner-primary", "fingerprint": "eaa6c6d150c2d658", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8ef95bbc06244a64", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/humata/page.tsx:55"}, "properties": {"repobilityId": "9b282b2dcd1fc6b0", "scanner": "scanner-primary", "fingerprint": "8ef95bbc06244a64", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1377158df0f43aea", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/alternatives/notebooklm/page.tsx:56"}, "properties": {"repobilityId": "85eb136e19b2a040", "scanner": "scanner-primary", "fingerprint": "1377158df0f43aea", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b110e91cea85f9c5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/tools/page.tsx:28"}, "properties": {"repobilityId": "aadb1e92a7af092c", "scanner": "scanner-primary", "fingerprint": "b110e91cea85f9c5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a5450bd8fa5c91db", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/tools/word-counter/page.tsx:29"}, "properties": {"repobilityId": "09b9e8915248ada7", "scanner": "scanner-primary", "fingerprint": "a5450bd8fa5c91db", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a7b4cd413a0fe60d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/tools/word-counter/WordCounterClient.tsx:296"}, "properties": {"repobilityId": "26df68dbb1d63114", "scanner": "scanner-primary", "fingerprint": "a7b4cd413a0fe60d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5bd9f690b7452efa", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/tools/reading-time/page.tsx:29"}, "properties": {"repobilityId": "5fcd101bbb858529", "scanner": "scanner-primary", "fingerprint": "5bd9f690b7452efa", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-02bdb3393f816b60", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/terms/page.tsx:21"}, "properties": {"repobilityId": "17b36dc90e563525", "scanner": "scanner-primary", "fingerprint": "02bdb3393f816b60", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-58be0c5c69ab6296", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/privacy/page.tsx:21"}, "properties": {"repobilityId": "da3f4ab68edc45b4", "scanner": "scanner-primary", "fingerprint": "58be0c5c69ab6296", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c9913e45275a2b42", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/page.tsx:22"}, "properties": {"repobilityId": "812877d3311def9a", "scanner": "scanner-primary", "fingerprint": "c9913e45275a2b42", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-59daec189cc23225", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/askyourpdf/page.tsx:43"}, "properties": {"repobilityId": "40c4bde5c18c73e4", "scanner": "scanner-primary", "fingerprint": "59daec189cc23225", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d2133485232f769e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/chatpdf/page.tsx:47"}, "properties": {"repobilityId": "2c594ca7337ff8fd", "scanner": "scanner-primary", "fingerprint": "d2133485232f769e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e65392ee56921714", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/pdf-ai/page.tsx:43"}, "properties": {"repobilityId": "883ed6faecb71f4a", "scanner": "scanner-primary", "fingerprint": "e65392ee56921714", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c1d258c2e09307e6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/humata/page.tsx:43"}, "properties": {"repobilityId": "e89fd5fc7ad959db", "scanner": "scanner-primary", "fingerprint": "c1d258c2e09307e6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-da758b0a323d9718", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/compare/notebooklm/page.tsx:47"}, "properties": {"repobilityId": "70c5a57ba6fdd262", "scanner": "scanner-primary", "fingerprint": "da758b0a323d9718", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a0cffc5de4620607", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/page.tsx:22"}, "properties": {"repobilityId": "78eb69e97e208d0f", "scanner": "scanner-primary", "fingerprint": "a0cffc5de4620607", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7ed1e8efc9db0c62", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/multilingual/page.tsx:25"}, "properties": {"repobilityId": "b964997db9ca7a5c", "scanner": "scanner-primary", "fingerprint": "7ed1e8efc9db0c62", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8adb31bfb4193a13", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/free-demo/page.tsx:25"}, "properties": {"repobilityId": "f1d5acdb8121eba3", "scanner": "scanner-primary", "fingerprint": "8adb31bfb4193a13", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-326efadf1ded9a19", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/performance-modes/page.tsx:25"}, "properties": {"repobilityId": "6f48db9a400856dc", "scanner": "scanner-primary", "fingerprint": "326efadf1ded9a19", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0b3e39f4e9555e5d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/citations/page.tsx:25"}, "properties": {"repobilityId": "047458d042e5c001", "scanner": "scanner-primary", "fingerprint": "0b3e39f4e9555e5d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d90f410b8729467d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/features/multi-format/page.tsx:25"}, "properties": {"repobilityId": "79562174046e64d1", "scanner": "scanner-primary", "fingerprint": "d90f410b8729467d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-45c613a25cc01735", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/pricing/page.tsx:27"}, "properties": {"repobilityId": "a8a8ad5a74c972e8", "scanner": "scanner-primary", "fingerprint": "45c613a25cc01735", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ee2c8bf22a87187e", "level": "warning", "message": {"text": "Dockerfile runs as root: infra/minio/Dockerfile"}, "properties": {"repobilityId": "d5d362d6c3f11bb9", "scanner": "scanner-primary", "fingerprint": "ee2c8bf22a87187e", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-c7085545d9cae6c0", "level": "warning", "message": {"text": "Docker base image uses a mutable or implicit tag: minio/minio:latest"}, "properties": {"repobilityId": "83a30a50f773c75e", "scanner": "scanner-primary", "fingerprint": "c7085545d9cae6c0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/minio/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-806690b0cf7af634", "level": "warning", "message": {"text": "Dockerfile runs as root: infra/qdrant/Dockerfile"}, "properties": {"repobilityId": "d2f0c0d968999641", "scanner": "scanner-primary", "fingerprint": "806690b0cf7af634", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-418922e429b4173c", "level": "warning", "message": {"text": "Docker base image uses a mutable or implicit tag: qdrant/qdrant:latest"}, "properties": {"repobilityId": "add84bba707efa31", "scanner": "scanner-primary", "fingerprint": "418922e429b4173c", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/qdrant/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-08d27d332cd153b5", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12.7-slim"}, "properties": {"repobilityId": "0d14e9b598dedf6b", "scanner": "scanner-primary", "fingerprint": "08d27d332cd153b5", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-8b6ce15e4a013193", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/JsonLdScript.tsx:43"}, "properties": {"repobilityId": "f3489150660ca513", "scanner": "scanner-primary", "fingerprint": "8b6ce15e4a013193", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/JsonLdScript.tsx"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-d342f077b3cf76aa", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/Chat/MessageBubble.tsx:148"}, "properties": {"repobilityId": "c0455c52a83f3c27", "scanner": "scanner-primary", "fingerprint": "d342f077b3cf76aa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/Chat/MessageBubble.tsx"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-400f97fc685009b4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/marketing/MarketingArticleJsonLd.tsx:45"}, "properties": {"repobilityId": "63eca11cef8128d6", "scanner": "scanner-primary", "fingerprint": "400f97fc685009b4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/marketing/MarketingArticleJsonLd.tsx"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-f9768af17e76f1c2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/page.tsx:36"}, "properties": {"repobilityId": "3e23be1f29cad57c", "scanner": "scanner-primary", "fingerprint": "f9768af17e76f1c2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/page.tsx"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-c3200b7be5932445", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/about/page.tsx:21"}, "properties": {"repobilityId": "0930b7abc837e19d", "scanner": "scanner-primary", "fingerprint": "c3200b7be5932445", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/about/page.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-c7fa8d6e002c44ff", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/blog/page.tsx:24"}, "properties": {"repobilityId": "07a95d3a1d719b18", "scanner": "scanner-primary", "fingerprint": "c7fa8d6e002c44ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/blog/page.tsx"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-9fed7bf557bd233e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/blog/category/[category]/page.tsx:39"}, "properties": {"repobilityId": "a16c0425b11e81d7", "scanner": "scanner-primary", "fingerprint": "9fed7bf557bd233e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/blog/category/[category]/page.tsx"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-3a875e78083a06e0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/blog/[slug]/page.tsx:68"}, "properties": {"repobilityId": "8978e7eea2e9633f", "scanner": "scanner-primary", "fingerprint": "3a875e78083a06e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/blog/[slug]/page.tsx"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-b1e5e187624fdb2e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/demo/page.tsx:21"}, "properties": {"repobilityId": "8c716e1d888d83e5", "scanner": "scanner-primary", "fingerprint": "b1e5e187624fdb2e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/demo/page.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-60c94e0cd1ad5380", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/contact/page.tsx:21"}, "properties": {"repobilityId": "5788fcf64a8a3916", "scanner": "scanner-primary", "fingerprint": "60c94e0cd1ad5380", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/contact/page.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-75f1f8686337d6e7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/page.tsx:22"}, "properties": {"repobilityId": "d673139016d3e68b", "scanner": "scanner-primary", "fingerprint": "75f1f8686337d6e7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/page.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-ce7bb3a1fcea69a4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/real-estate/page.tsx:52"}, "properties": {"repobilityId": "5cb8b2f74ad5ed47", "scanner": "scanner-primary", "fingerprint": "ce7bb3a1fcea69a4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/real-estate/page.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-910cf502b60b0b70", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/students/page.tsx:52"}, "properties": {"repobilityId": "5aa7a5d83cff3c30", "scanner": "scanner-primary", "fingerprint": "910cf502b60b0b70", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/students/page.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-5f255bcba9a0048f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/finance/page.tsx:64"}, "properties": {"repobilityId": "55d9c9b50c14ae0e", "scanner": "scanner-primary", "fingerprint": "5f255bcba9a0048f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/finance/page.tsx"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-92a2ebbb3f8718a1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/compliance/page.tsx:52"}, "properties": {"repobilityId": "3679776c4a966598", "scanner": "scanner-primary", "fingerprint": "92a2ebbb3f8718a1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/compliance/page.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-102a2ec9df80fdb7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/hr-contracts/page.tsx:47"}, "properties": {"repobilityId": "49d753adf75a5d38", "scanner": "scanner-primary", "fingerprint": "102a2ec9df80fdb7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/hr-contracts/page.tsx"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-fca4ab300b2d4110", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/healthcare/page.tsx:52"}, "properties": {"repobilityId": "505d4a6239d0ecf3", "scanner": "scanner-primary", "fingerprint": "fca4ab300b2d4110", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/healthcare/page.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-85fe9ce0c7faa58d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/teachers/page.tsx:52"}, "properties": {"repobilityId": "8affae7cae22d5fa", "scanner": "scanner-primary", "fingerprint": "85fe9ce0c7faa58d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/teachers/page.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-34f3f800903136f3", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/consultants/page.tsx:52"}, "properties": {"repobilityId": "c8a2829038650785", "scanner": "scanner-primary", "fingerprint": "34f3f800903136f3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/consultants/page.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-7f4383aff25922f7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/use-cases/lawyers/LawyersJsonLd.tsx:63"}, "properties": {"repobilityId": "1a190c08834ff26d", "scanner": "scanner-primary", "fingerprint": "7f4383aff25922f7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/use-cases/lawyers/LawyersJsonLd.tsx"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-5da22a4bfd95bb36", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/imprint/page.tsx:21"}, "properties": {"repobilityId": "2096876b3d7f0f1e", "scanner": "scanner-primary", "fingerprint": "5da22a4bfd95bb36", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/imprint/page.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-511b4d7f3c218574", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/[locale]/page.tsx:64"}, "properties": {"repobilityId": "370ce1834a1fdce8", "scanner": "scanner-primary", "fingerprint": "511b4d7f3c218574", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/[locale]/page.tsx"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-30c69d833c6c660e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/trust/page.tsx:22"}, "properties": {"repobilityId": "69cec7efae456b97", "scanner": "scanner-primary", "fingerprint": "30c69d833c6c660e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/trust/page.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-66d3ee4ed5ea50f9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/page.tsx:22"}, "properties": {"repobilityId": "13df5f8e13e3b412", "scanner": "scanner-primary", "fingerprint": "66d3ee4ed5ea50f9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/alternatives/page.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-dec42e5acbe4c7c6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/askyourpdf/page.tsx:57"}, "properties": {"repobilityId": "deeae4b5be44811c", "scanner": "scanner-primary", "fingerprint": "dec42e5acbe4c7c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/alternatives/askyourpdf/page.tsx"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-8a2ca5a0c1919e2b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/chatpdf/page.tsx:57"}, "properties": {"repobilityId": "d1960031647ef055", "scanner": "scanner-primary", "fingerprint": "8a2ca5a0c1919e2b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/alternatives/chatpdf/page.tsx"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-937e8f62bcdcc2e0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/pdf-ai/page.tsx:57"}, "properties": {"repobilityId": "7e2e426c58ccaa5f", "scanner": "scanner-primary", "fingerprint": "937e8f62bcdcc2e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/alternatives/pdf-ai/page.tsx"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-468ddae111ded52e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/humata/page.tsx:55"}, "properties": {"repobilityId": "c7b013de59ffafcf", "scanner": "scanner-primary", "fingerprint": "468ddae111ded52e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/alternatives/humata/page.tsx"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-736a96e899442adb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/alternatives/notebooklm/page.tsx:56"}, "properties": {"repobilityId": "187e8fb4f396a493", "scanner": "scanner-primary", "fingerprint": "736a96e899442adb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/alternatives/notebooklm/page.tsx"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-878671e3a72b355a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/tools/page.tsx:28"}, "properties": {"repobilityId": "c1152058b232d89a", "scanner": "scanner-primary", "fingerprint": "878671e3a72b355a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/tools/page.tsx"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-85f25cbb730285a5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/tools/word-counter/page.tsx:29"}, "properties": {"repobilityId": "2cb12109dae0050c", "scanner": "scanner-primary", "fingerprint": "85f25cbb730285a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/tools/word-counter/page.tsx"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-1cff41a3524da50a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/tools/reading-time/page.tsx:29"}, "properties": {"repobilityId": "a954eaecf7b24cb0", "scanner": "scanner-primary", "fingerprint": "1cff41a3524da50a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/tools/reading-time/page.tsx"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-dafea5198e9f0005", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/terms/page.tsx:21"}, "properties": {"repobilityId": "bf01b93ab6d0edeb", "scanner": "scanner-primary", "fingerprint": "dafea5198e9f0005", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/terms/page.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-6b03f986d2600193", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/privacy/page.tsx:21"}, "properties": {"repobilityId": "966b8cc2f31d9cc1", "scanner": "scanner-primary", "fingerprint": "6b03f986d2600193", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/privacy/page.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-a5df7cfafc362c89", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/page.tsx:22"}, "properties": {"repobilityId": "e5458ca0a32853a9", "scanner": "scanner-primary", "fingerprint": "a5df7cfafc362c89", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/compare/page.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-e446b32cab066187", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/askyourpdf/page.tsx:43"}, "properties": {"repobilityId": "e4e4a57cecb8e3e0", "scanner": "scanner-primary", "fingerprint": "e446b32cab066187", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/compare/askyourpdf/page.tsx"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-c2c4a7a18a56f52e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/chatpdf/page.tsx:47"}, "properties": {"repobilityId": "a5e1b205e9481f00", "scanner": "scanner-primary", "fingerprint": "c2c4a7a18a56f52e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/compare/chatpdf/page.tsx"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-888811cff406d9a6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/pdf-ai/page.tsx:43"}, "properties": {"repobilityId": "ca27f51d0f3ba61c", "scanner": "scanner-primary", "fingerprint": "888811cff406d9a6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/compare/pdf-ai/page.tsx"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-c53e61384f49f000", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/humata/page.tsx:43"}, "properties": {"repobilityId": "97e7ac64b0cb0979", "scanner": "scanner-primary", "fingerprint": "c53e61384f49f000", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/compare/humata/page.tsx"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-2576f228641b6fdd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/compare/notebooklm/page.tsx:47"}, "properties": {"repobilityId": "37b5f1ea4994d368", "scanner": "scanner-primary", "fingerprint": "2576f228641b6fdd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/compare/notebooklm/page.tsx"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-74d777255ea6e208", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/page.tsx:22"}, "properties": {"repobilityId": "cd6bc891bd727054", "scanner": "scanner-primary", "fingerprint": "74d777255ea6e208", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/features/page.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-accc085fe9820c01", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/multilingual/page.tsx:25"}, "properties": {"repobilityId": "4cddfa31f21baeba", "scanner": "scanner-primary", "fingerprint": "accc085fe9820c01", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/features/multilingual/page.tsx"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-63fad309f3e3b5cc", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/free-demo/page.tsx:25"}, "properties": {"repobilityId": "7f474946bd9275ac", "scanner": "scanner-primary", "fingerprint": "63fad309f3e3b5cc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/features/free-demo/page.tsx"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-8404f9730d39c345", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/performance-modes/page.tsx:25"}, "properties": {"repobilityId": "c76ed0ced8a8649d", "scanner": "scanner-primary", "fingerprint": "8404f9730d39c345", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/features/performance-modes/page.tsx"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-6af616abc569bb69", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/citations/page.tsx:25"}, "properties": {"repobilityId": "188908b1f8decf96", "scanner": "scanner-primary", "fingerprint": "6af616abc569bb69", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/features/citations/page.tsx"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-fd389b21f5a77f8b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/features/multi-format/page.tsx:25"}, "properties": {"repobilityId": "544141a95fcc5a52", "scanner": "scanner-primary", "fingerprint": "fd389b21f5a77f8b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/features/multi-format/page.tsx"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-226364e8c731c120", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/pricing/page.tsx:27"}, "properties": {"repobilityId": "3ea25cdd2d0d2452", "scanner": "scanner-primary", "fingerprint": "226364e8c731c120", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/pricing/page.tsx"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-1b649383bc3d0eb0", "level": "note", "message": {"text": "Very large file: frontend/src/app/billing/BillingPageClient.tsx (1217 lines)"}, "properties": {"repobilityId": "72e08767dcf92fad", "scanner": "scanner-primary", "fingerprint": "1b649383bc3d0eb0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a6e4d632a11142b3", "level": "note", "message": {"text": "Very large file: backend/app/api/admin.py (2503 lines)"}, "properties": {"repobilityId": "e3e6ecfb061333fa", "scanner": "scanner-primary", "fingerprint": "a6e4d632a11142b3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-83be73982133ce59", "level": "note", "message": {"text": "Very large file: backend/app/api/billing.py (1446 lines)"}, "properties": {"repobilityId": "5e3e06cad307c5ba", "scanner": "scanner-primary", "fingerprint": "83be73982133ce59", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9cd57bbba479cadd", "level": "note", "message": {"text": "Very large file: backend/app/services/chat_service.py (2625 lines)"}, "properties": {"repobilityId": "2c0f4d51d1708d26", "scanner": "scanner-primary", "fingerprint": "9cd57bbba479cadd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e3f9312ff0b79dbe", "level": "note", "message": {"text": "Very large file: backend/app/services/document_brief_service.py (1885 lines)"}, "properties": {"repobilityId": "ed648982a4ec5519", "scanner": "scanner-primary", "fingerprint": "e3f9312ff0b79dbe", "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-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "7fa47f481f02bceb", "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": "5db07601b3d6ae40", "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": "3537cbf1f19eb55f", "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": "81fec19e81e5c918", "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": "ba6ff20155aa91a2", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-82ce58fa898b7a1e", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/vuln-hunt.md"}, "properties": {"repobilityId": "ed8fba59ca5117ef", "scanner": "scanner-primary", "fingerprint": "82ce58fa898b7a1e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/vuln-hunt.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f0eeb2c042582b42", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/next.config.mjs:30"}, "properties": {"repobilityId": "dba10e703ead1bdf", "scanner": "scanner-primary", "fingerprint": "f0eeb2c042582b42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a85a1406861806eb", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/CookieConsentBanner.tsx:31"}, "properties": {"repobilityId": "eac85d0ffc181352", "scanner": "scanner-primary", "fingerprint": "a85a1406861806eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18285893603f610e", "level": "note", "message": {"text": "Legacy-named symbol `confusing_copy` in frontend/src/components/FeedbackButton.tsx:90"}, "properties": {"repobilityId": "b632eb5bd1390af4", "scanner": "scanner-primary", "fingerprint": "18285893603f610e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e6054b05c096380c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/TextViewer/TextViewer.tsx:215"}, "properties": {"repobilityId": "199b6fdc431a2537", "scanner": "scanner-primary", "fingerprint": "e6054b05c096380c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a04ca317b12a626", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/Chat/MessageBubble.tsx:88"}, "properties": {"repobilityId": "d0fa118c31e83760", "scanner": "scanner-primary", "fingerprint": "9a04ca317b12a626", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2305231c9b9c0ab8", "level": "none", "message": {"text": "Commented-code block (13 lines) in frontend/src/components/Chat/ChatPanel.tsx:437"}, "properties": {"repobilityId": "eeb2d9716d3224d9", "scanner": "scanner-primary", "fingerprint": "2305231c9b9c0ab8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d6b79a5413e6c83", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/app/layout.tsx:70"}, "properties": {"repobilityId": "31657bd88a6a306d", "scanner": "scanner-primary", "fingerprint": "6d6b79a5413e6c83", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82685709260a6472", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/contact/route.ts:98"}, "properties": {"repobilityId": "9d73529868a6c6b4", "scanner": "scanner-primary", "fingerprint": "82685709260a6472", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a6331e198552f6e3", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/app/api/proxy/[...path]/route.ts:79"}, "properties": {"repobilityId": "3efa300e4f7465e5", "scanner": "scanner-primary", "fingerprint": "a6331e198552f6e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8dcbd3d483f9abda", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/indexnow/route.ts:39"}, "properties": {"repobilityId": "d44672b5dbd4b56b", "scanner": "scanner-primary", "fingerprint": "8dcbd3d483f9abda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8dd93d6fa2d91478", "level": "note", "message": {"text": "Legacy-named symbol `CspReportLegacy` in frontend/src/app/api/csp-report/route.ts:84"}, "properties": {"repobilityId": "4bb3dc41cfae91f6", "scanner": "scanner-primary", "fingerprint": "8dd93d6fa2d91478", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a5548134d7f997e6", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/app/api/csp-report/route.ts:30"}, "properties": {"repobilityId": "4de87687ffa7a840", "scanner": "scanner-primary", "fingerprint": "a5548134d7f997e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9f299443433c10b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/api.ts:125"}, "properties": {"repobilityId": "6994ae918319b6c9", "scanner": "scanner-primary", "fingerprint": "d9f299443433c10b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f1d7581203908eb4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/auth.ts:91"}, "properties": {"repobilityId": "c83c7b354a3b7ee6", "scanner": "scanner-primary", "fingerprint": "f1d7581203908eb4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-027b72c1aecef345", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/errorCopy.ts:462"}, "properties": {"repobilityId": "477382f8b52458ec", "scanner": "scanner-primary", "fingerprint": "027b72c1aecef345", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84628d7c6f846951", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/sse.ts:174"}, "properties": {"repobilityId": "6ac2719c025a870e", "scanner": "scanner-primary", "fingerprint": "84628d7c6f846951", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c1572bde189e20ff", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/useChatStream.ts:118"}, "properties": {"repobilityId": "f73019b68c345fc7", "scanner": "scanner-primary", "fingerprint": "c1572bde189e20ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d386afed62e8c6db", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/authAdapter.ts:54"}, "properties": {"repobilityId": "377c22e88c6eb13b", "scanner": "scanner-primary", "fingerprint": "d386afed62e8c6db", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ad3593511289da5f", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/store/index.ts:296"}, "properties": {"repobilityId": "ec96fb1d26776d18", "scanner": "scanner-primary", "fingerprint": "ad3593511289da5f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-769a68773e2ebd01", "level": "note", "message": {"text": "Legacy-named symbol `u_old` in backend/tests/test_admin_retention.py:120"}, "properties": {"repobilityId": "7e1d8d378c3b0aca", "scanner": "scanner-primary", "fingerprint": "769a68773e2ebd01", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-229bec7585d69a36", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/tests/test_proxy_ip_verification.py:211"}, "properties": {"repobilityId": "0cd8cc3f20d3bd88", "scanner": "scanner-primary", "fingerprint": "229bec7585d69a36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70c80fea72ce4f3a", "level": "note", "message": {"text": "Legacy-named symbol `test_ingest_url_blocked_fetch_reasons_share_safe_error_copy` in backend/tests/test_error_taxonomy.py:329"}, "properties": {"repobilityId": "8f78942456dfd671", "scanner": "scanner-primary", "fingerprint": "70c80fea72ce4f3a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7b81bc1a9f92ac48", "level": "note", "message": {"text": "Legacy-named symbol `sub_old` in backend/tests/test_billing_logic.py:124"}, "properties": {"repobilityId": "d3a439d771d6dd2a", "scanner": "scanner-primary", "fingerprint": "7b81bc1a9f92ac48", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-44cf7aec6421598d", "level": "note", "message": {"text": "Legacy-named symbol `locked_copy` in backend/tests/test_billing_cancel.py:427"}, "properties": {"repobilityId": "ab8aa747ab31166a", "scanner": "scanner-primary", "fingerprint": "44cf7aec6421598d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ee7054b44517607c", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/scripts/find_low_quality_docs.py:65"}, "properties": {"repobilityId": "39da3e488591a68e", "scanner": "scanner-primary", "fingerprint": "ee7054b44517607c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b84cb775432d6add", "level": "note", "message": {"text": "Legacy-named symbol `document_brief_v1` in backend/app/models/tables.py:648"}, "properties": {"repobilityId": "652129d0db274351", "scanner": "scanner-primary", "fingerprint": "b84cb775432d6add", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-620f7c59abf2dcbe", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/api/billing.py:911"}, "properties": {"repobilityId": "50b0806f4f9724fa", "scanner": "scanner-primary", "fingerprint": "620f7c59abf2dcbe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aef4d6aaab41260b", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/workers/parse_worker.py:145"}, "properties": {"repobilityId": "0d81785bdd1b57fe", "scanner": "scanner-primary", "fingerprint": "aef4d6aaab41260b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d4a7a903612b71e", "level": "note", "message": {"text": "Legacy-named symbol `document_brief_v1` in backend/app/services/summary_service.py:27"}, "properties": {"repobilityId": "17c6c26be8b95588", "scanner": "scanner-primary", "fingerprint": "5d4a7a903612b71e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5a1edfef846e1084", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/services/chat_service.py:1328"}, "properties": {"repobilityId": "baf765a0a7c52cdb", "scanner": "scanner-primary", "fingerprint": "5a1edfef846e1084", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f0a62556295e0a9", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/services/export_service.py:13"}, "properties": {"repobilityId": "135bc31c8c1092a2", "scanner": "scanner-primary", "fingerprint": "3f0a62556295e0a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6354a8c89bc161f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/services/parse_service.py:89"}, "properties": {"repobilityId": "f1b7eac80cd6b0bd", "scanner": "scanner-primary", "fingerprint": "6354a8c89bc161f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82110f38ebbeafd1", "level": "note", "message": {"text": "Legacy-named symbol `summary_map_reduce_v2` in backend/app/services/document_brief_service.py:34"}, "properties": {"repobilityId": "162c11f783d61528", "scanner": "scanner-primary", "fingerprint": "82110f38ebbeafd1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aac2baece1e8b8b0", "level": "note", "message": {"text": "Legacy-named symbol `document_brief_v1` in backend/alembic/versions/20260507_0026_add_document_briefs.py:21"}, "properties": {"repobilityId": "02939a96e9350d30", "scanner": "scanner-primary", "fingerprint": "aac2baece1e8b8b0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b0b7578dd2a289b6", "level": "note", "message": {"text": "26 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "8099a5c5713d37b9", "scanner": "scanner-primary", "fingerprint": "b0b7578dd2a289b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "344f9455694ec191", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b5308742893450a1", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "67f163f08ca1cad4", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "ceef96ca3c44404f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a28e619276868988", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "ef1fdd7f8023763f", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "935e74ed66547c43", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c9db6eb6225a48fa", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4a510b925da79375", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0c94e651e3edc3b8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "685e6dcdfa6f446e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e765a0b2ec8065b2", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "71ed69405d1f2be7", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "7bec86b1c3ba9f9c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2dc6829d98446fdc", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "eed4de9ce2e28b6b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6bd7fd418fdc67d5", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "314f990d8565592b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-39aeae0d5916bdbe", "level": "error", "message": {"text": "Dangling fetch: GET /api/proxy/api/credits/balance (frontend/src/components/CreditsDisplay.tsx:24)"}, "properties": {"repobilityId": "3412cf3414c3f747", "scanner": "scanner-primary", "fingerprint": "39aeae0d5916bdbe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3751cba31914a742", "level": "error", "message": {"text": "Dangling fetch: GET /api/proxy/api/users/profile (frontend/src/components/CreditsDisplay.tsx:39)"}, "properties": {"repobilityId": "0b088989c1c96b71", "scanner": "scanner-primary", "fingerprint": "3751cba31914a742", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2600e5f5f5d6b6ba", "level": "error", "message": {"text": "Dangling fetch: POST /api/contact (frontend/src/app/contact/ContactPageClient.tsx:48)"}, "properties": {"repobilityId": "9b76d410a8ddde2c", "scanner": "scanner-primary", "fingerprint": "2600e5f5f5d6b6ba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1399cf5c5f331482", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (frontend/src/app/api/contact/route.ts:98)"}, "properties": {"repobilityId": "f2afef36bf62a368", "scanner": "scanner-primary", "fingerprint": "1399cf5c5f331482", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b6425708179825e3", "level": "error", "message": {"text": "Dangling fetch: GET /api/proxy/api/billing/products (frontend/src/app/billing/BillingPageClient.tsx:189)"}, "properties": {"repobilityId": "b9eae7c42d8c8803", "scanner": "scanner-primary", "fingerprint": "b6425708179825e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fae96761306ea7da", "level": "error", "message": {"text": "Dangling fetch: POST /api/proxy/api/billing/checkout?pack_id=${packId} (frontend/src/app/billing/BillingPageClient.tsx:211)"}, "properties": {"repobilityId": "667c1a755531c39f", "scanner": "scanner-primary", "fingerprint": "fae96761306ea7da", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e2a5b1eda24b75db", "level": "error", "message": {"text": "Dangling fetch: GET /api/upload-token (frontend/src/lib/api.ts:125)"}, "properties": {"repobilityId": "fb89b511068f323d", "scanner": "scanner-primary", "fingerprint": "e2a5b1eda24b75db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d3323129d6f14adf", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (frontend/src/lib/auth.ts:91)"}, "properties": {"repobilityId": "64f69827743c7317", "scanner": "scanner-primary", "fingerprint": "d3323129d6f14adf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-10be1a04947ea15a", "level": "error", "message": {"text": "Dangling fetch: POST /api/proxy/api/events (frontend/src/lib/analytics.ts:17)"}, "properties": {"repobilityId": "40993f3235e41526", "scanner": "scanner-primary", "fingerprint": "10be1a04947ea15a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e35de536b500b74", "level": "note", "message": {"text": "Unused endpoint: GET /chunks/{chunk_id}"}, "properties": {"repobilityId": "67f31def8acbb909", "scanner": "scanner-primary", "fingerprint": "7e35de536b500b74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ed839d590a8e348", "level": "note", "message": {"text": "Unused endpoint: POST /api/sessions/{session_id}/share"}, "properties": {"repobilityId": "2e2e0e681f3bf205", "scanner": "scanner-primary", "fingerprint": "6ed839d590a8e348", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4afe3af1bf786259", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/sessions/{session_id}/share"}, "properties": {"repobilityId": "c2cc7f93e8693263", "scanner": "scanner-primary", "fingerprint": "4afe3af1bf786259", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-78958125ae705843", "level": "note", "message": {"text": "Unused endpoint: GET /api/shared/{share_token}"}, "properties": {"repobilityId": "2fddf2986a475ea1", "scanner": "scanner-primary", "fingerprint": "78958125ae705843", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "852bf06e2a2f7295", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-231cc5b9bdcf1283", "level": "note", "message": {"text": "Unused endpoint: POST /documents/{document_id}/tables/scan"}, "properties": {"repobilityId": "0351644f1d1058df", "scanner": "scanner-primary", "fingerprint": "231cc5b9bdcf1283", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-906a8dcdc1fc74d5", "level": "note", "message": {"text": "Unused endpoint: POST /document-tables/{table_id}/reconstruct"}, "properties": {"repobilityId": "5845fb063cb1fa5a", "scanner": "scanner-primary", "fingerprint": "906a8dcdc1fc74d5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fb456b8c2f17be9", "level": "note", "message": {"text": "Unused endpoint: GET /documents/{document_id}/tables"}, "properties": {"repobilityId": "4dc72762c3c9a119", "scanner": "scanner-primary", "fingerprint": "4fb456b8c2f17be9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ebc863a8616bdaaf", "level": "note", "message": {"text": "Unused endpoint: GET /documents/{document_id}/tables/export"}, "properties": {"repobilityId": "37ae88b35d0d0616", "scanner": "scanner-primary", "fingerprint": "ebc863a8616bdaaf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a81ec534949e37c0", "level": "note", "message": {"text": "Unused endpoint: GET /document-table-scans/{job_id}"}, "properties": {"repobilityId": "85fd597f9d2317c8", "scanner": "scanner-primary", "fingerprint": "a81ec534949e37c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3cf462f95b14fd05", "level": "note", "message": {"text": "Unused endpoint: GET /document-tables/{table_id}/export"}, "properties": {"repobilityId": "715796a2b01ba172", "scanner": "scanner-primary", "fingerprint": "3cf462f95b14fd05", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bca8100a44f7f25", "level": "note", "message": {"text": "Unused endpoint: POST /users"}, "properties": {"repobilityId": "e6df0f8a4bb600eb", "scanner": "scanner-primary", "fingerprint": "1bca8100a44f7f25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d18411a066b7e2c1", "level": "note", "message": {"text": "Unused endpoint: GET /users/{user_id}"}, "properties": {"repobilityId": "103e74eb4d85a5af", "scanner": "scanner-primary", "fingerprint": "d18411a066b7e2c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0466faf660a7e2fc", "level": "note", "message": {"text": "Unused endpoint: GET /users/by-email/{email}"}, "properties": {"repobilityId": "c0168c497401b45c", "scanner": "scanner-primary", "fingerprint": "0466faf660a7e2fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b76c13b28ad04e13", "level": "note", "message": {"text": "Unused endpoint: GET /users/by-account/{provider}/{provider_account_id}"}, "properties": {"repobilityId": "c6cbb84cc0f5beb4", "scanner": "scanner-primary", "fingerprint": "b76c13b28ad04e13", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d07acca647618197", "level": "note", "message": {"text": "Unused endpoint: PUT /users/{user_id}"}, "properties": {"repobilityId": "cb81ae22c6d952a6", "scanner": "scanner-primary", "fingerprint": "d07acca647618197", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fecd99fa2d3d6078", "level": "note", "message": {"text": "Unused endpoint: DELETE /users/{user_id}"}, "properties": {"repobilityId": "4a372b1c4594b5a8", "scanner": "scanner-primary", "fingerprint": "fecd99fa2d3d6078", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c04406fe463e162f", "level": "note", "message": {"text": "Unused endpoint: POST /accounts"}, "properties": {"repobilityId": "686b5f05505ec8a4", "scanner": "scanner-primary", "fingerprint": "c04406fe463e162f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8b30199bbd10358", "level": "note", "message": {"text": "Unused endpoint: DELETE /accounts/{provider}/{provider_account_id}"}, "properties": {"repobilityId": "872eb17e482c1820", "scanner": "scanner-primary", "fingerprint": "a8b30199bbd10358", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-48b2276617b76f9a", "level": "note", "message": {"text": "Unused endpoint: POST /verification-tokens"}, "properties": {"repobilityId": "4322b9708d60817b", "scanner": "scanner-primary", "fingerprint": "48b2276617b76f9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1646dc7417be05e0", "level": "note", "message": {"text": "Unused endpoint: POST /verification-tokens/use"}, "properties": {"repobilityId": "3067a38113e38d54", "scanner": "scanner-primary", "fingerprint": "1646dc7417be05e0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "8365ff3bc2e38d0f", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68fbf5570787c70d", "level": "note", "message": {"text": "Unused endpoint: GET /{collection_id}"}, "properties": {"repobilityId": "e9ccc96f702b2a4f", "scanner": "scanner-primary", "fingerprint": "68fbf5570787c70d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b88035bbb53fadec", "level": "note", "message": {"text": "Unused endpoint: DELETE /{collection_id}"}, "properties": {"repobilityId": "b3b7a375f5f26417", "scanner": "scanner-primary", "fingerprint": "b88035bbb53fadec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-21f239106a095b6a", "level": "note", "message": {"text": "Unused endpoint: POST /{collection_id}/documents"}, "properties": {"repobilityId": "5c32d4b9a5bedd23", "scanner": "scanner-primary", "fingerprint": "21f239106a095b6a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f649216de490f7a8", "level": "note", "message": {"text": "Unused endpoint: DELETE /{collection_id}/documents/{document_id}"}, "properties": {"repobilityId": "88cf0ee077ad3d99", "scanner": "scanner-primary", "fingerprint": "f649216de490f7a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e0dffc8fdd44ba7", "level": "note", "message": {"text": "Unused endpoint: POST /{collection_id}/sessions"}, "properties": {"repobilityId": "3df86eb54acd035c", "scanner": "scanner-primary", "fingerprint": "7e0dffc8fdd44ba7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-47ccf136d127e0cc", "level": "note", "message": {"text": "Unused endpoint: GET /{collection_id}/sessions"}, "properties": {"repobilityId": "648262a8387d9e20", "scanner": "scanner-primary", "fingerprint": "47ccf136d127e0cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac2f552bf9d967ce", "level": "note", "message": {"text": "Unused endpoint: GET /overview"}, "properties": {"repobilityId": "fb213784550f0203", "scanner": "scanner-primary", "fingerprint": "ac2f552bf9d967ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db5b5837abddb8b5", "level": "note", "message": {"text": "Unused endpoint: GET /trends"}, "properties": {"repobilityId": "b58d1d7114fb8737", "scanner": "scanner-primary", "fingerprint": "db5b5837abddb8b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3558a78a26ebdf7e", "level": "note", "message": {"text": "Unused endpoint: GET /breakdowns"}, "properties": {"repobilityId": "3ec6c9bb0c93c944", "scanner": "scanner-primary", "fingerprint": "3558a78a26ebdf7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c72e441f29f4c4e2", "level": "note", "message": {"text": "Unused endpoint: GET /user-activity"}, "properties": {"repobilityId": "feac66af5d79c78f", "scanner": "scanner-primary", "fingerprint": "c72e441f29f4c4e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b0399243c128aed5", "level": "note", "message": {"text": "Unused endpoint: GET /retention"}, "properties": {"repobilityId": "4cdd60a712378183", "scanner": "scanner-primary", "fingerprint": "b0399243c128aed5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de9fcb1422a0afb6", "level": "note", "message": {"text": "Unused endpoint: GET /churn"}, "properties": {"repobilityId": "963a7c6abe9a49c2", "scanner": "scanner-primary", "fingerprint": "de9fcb1422a0afb6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dfe1d9e78120fad3", "level": "note", "message": {"text": "Unused endpoint: GET /billing-health"}, "properties": {"repobilityId": "f09305b12a97c30c", "scanner": "scanner-primary", "fingerprint": "dfe1d9e78120fad3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e03a6de6e7f5fe8", "level": "note", "message": {"text": "Unused endpoint: GET /funnel"}, "properties": {"repobilityId": "a07ee0e972ec18ea", "scanner": "scanner-primary", "fingerprint": "3e03a6de6e7f5fe8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5d46a57becfbd3f", "level": "note", "message": {"text": "Unused endpoint: GET /rag-quality"}, "properties": {"repobilityId": "54a0f74fc56559c5", "scanner": "scanner-primary", "fingerprint": "c5d46a57becfbd3f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4314736ef0c8b7f8", "level": "note", "message": {"text": "Unused endpoint: GET /recent-users"}, "properties": {"repobilityId": "38e00909538ecb0d", "scanner": "scanner-primary", "fingerprint": "4314736ef0c8b7f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9ce3d8441000e9b", "level": "note", "message": {"text": "Unused endpoint: GET /top-users"}, "properties": {"repobilityId": "a2466cd2cbb0827d", "scanner": "scanner-primary", "fingerprint": "a9ce3d8441000e9b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f106c7253fc15ffb", "level": "note", "message": {"text": "Unused endpoint: POST /document-diffs"}, "properties": {"repobilityId": "ebbbff72ef90b4f7", "scanner": "scanner-primary", "fingerprint": "f106c7253fc15ffb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ecb497d1a4511694", "level": "note", "message": {"text": "Unused endpoint: GET /document-diffs"}, "properties": {"repobilityId": "80d6a4fc0196d584", "scanner": "scanner-primary", "fingerprint": "ecb497d1a4511694", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b7ba387ab8dac09", "level": "note", "message": {"text": "Unused endpoint: GET /document-diffs/{job_id}"}, "properties": {"repobilityId": "09d9ffe9f3eb5795", "scanner": "scanner-primary", "fingerprint": "1b7ba387ab8dac09", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-446599339af2dfbc", "level": "note", "message": {"text": "Unused endpoint: GET /document-diffs/{job_id}/export"}, "properties": {"repobilityId": "49cc0b44151f97ee", "scanner": "scanner-primary", "fingerprint": "446599339af2dfbc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24d2fb2e01efb33b", "level": "note", "message": {"text": "Unused endpoint: GET /document-jobs/{job_id}"}, "properties": {"repobilityId": "c31fec960f0e9238", "scanner": "scanner-primary", "fingerprint": "24d2fb2e01efb33b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "ba922a873c7e27b6", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2595b39638e5c045", "level": "note", "message": {"text": "Unused endpoint: GET /profile"}, "properties": {"repobilityId": "ccfc3111fb4c571a", "scanner": "scanner-primary", "fingerprint": "2595b39638e5c045", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc75577108e5e2a9", "level": "note", "message": {"text": "Unused endpoint: GET /usage-breakdown"}, "properties": {"repobilityId": "d5f9b38b1a6b5a1f", "scanner": "scanner-primary", "fingerprint": "cc75577108e5e2a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7244774f57779581", "level": "note", "message": {"text": "Unused endpoint: GET /me/export"}, "properties": {"repobilityId": "260ea8d4ab9fd61c", "scanner": "scanner-primary", "fingerprint": "7244774f57779581", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-380780ae47e04514", "level": "note", "message": {"text": "Unused endpoint: DELETE /me"}, "properties": {"repobilityId": "de63cff7ee254161", "scanner": "scanner-primary", "fingerprint": "380780ae47e04514", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af8d7d67290dbbcc", "level": "note", "message": {"text": "Unused endpoint: GET /api/sessions/{session_id}/export"}, "properties": {"repobilityId": "51ffead470598caf", "scanner": "scanner-primary", "fingerprint": "af8d7d67290dbbcc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}