{"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-3834d17510f97ae6", "name": "Stray `console.log` in TS/JS \u2014 ops/bridge.js:272", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ops/bridge.js:272"}, "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-00f46b803cf9bd3d", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/main.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/main.ts:89"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c115e1206eecc99a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/components/scope-banner.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/components/scope-banner.tsx:109"}, "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-a774f3ec61913874", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/components/icon-picker.tsx:294", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/components/icon-picker.tsx:294"}, "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-b9c62f55236c993d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/components/order-detail-modal.tsx:1299", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/components/order-detail-modal.tsx:1299"}, "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-3883a31ee4daf755", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/components/order-detail-modal.tsx:1838", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/components/order-detail-modal.tsx:1838"}, "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-9db8f475275acbe5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/components/inbox/SuggestionBanner.tsx:88", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/components/inbox/SuggestionBanner.tsx:88"}, "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-bbcc25e97ce9de21", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/layout.tsx:227", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/layout.tsx:227"}, "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-49f9eab5a4e4a791", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/suno/_content.tsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/suno/_content.tsx:285"}, "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-fc2be90f435836b2", "name": "Icon-only button without accessible name \u2014 apps/admin/app/(dashboard)/analytics/_content.tsx:1425", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/admin/app/(dashboard)/analytics/_content.tsx:1425"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7dd4520d4653938f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/analytics/_content.tsx:376", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/analytics/_content.tsx:376"}, "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-c3f92f1b8df717c7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/generations/_content.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/generations/_content.tsx:172"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7aea3eb163dea0e2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/site-demos/_content.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/site-demos/_content.tsx:209"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d1a9906ac6223e36", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/errors/_content.tsx:266", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/errors/_content.tsx:266"}, "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-6f410617be92e8bb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/chat/_content.tsx:788", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/chat/_content.tsx:788"}, "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-1e4ad47e9d05b911", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/emails/_content.tsx:262", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/emails/_content.tsx:262"}, "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-8020f62d0c489591", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/marketing/_content.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/marketing/_content.tsx:171"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7522d2d39deb94bc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/site/_content.tsx:688", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/site/_content.tsx:688"}, "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-63e5b6c2d7b8e508", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/terminal/_content.tsx:569", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/terminal/_content.tsx:569"}, "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-6e7206e9e3d0f802", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/payments/_content.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/payments/_content.tsx:153"}, "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-4b41253509203705", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/ai-monitor/_content.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/ai-monitor/_content.tsx:284"}, "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-f94437aa900cc304", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/promo/_content.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/promo/_content.tsx:237"}, "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-a1a296f8f51ddf58", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/sites/_content.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/sites/_content.tsx:156"}, "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-9aaaf88416917e70", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/inbox/_content.tsx:242", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/inbox/_content.tsx:242"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4417f9d8eda3143c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/inbox/accounts/_content.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/inbox/accounts/_content.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-291040b548cc4e85", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/inbox/knowledge/_content.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/inbox/knowledge/_content.tsx:111"}, "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-0b13a74bf141ef77", "name": "Icon-only button without accessible name \u2014 apps/web/components/sections.tsx:232", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/components/sections.tsx:232"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3668fe2337005b94", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/sections.tsx:33", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/sections.tsx:33"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fc93bc319c6ec941", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/SiteShell.tsx:68", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/SiteShell.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-9e7eb3cca1109ca7", "name": "Icon-only button without accessible name \u2014 apps/web/components/RouletteWheel.tsx:145", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/components/RouletteWheel.tsx:145"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e49e6383a0a43da9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/page.tsx:81", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/page.tsx:81"}, "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-379747909220cd1d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/layout.tsx:171", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/layout.tsx:171"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c50d5aa09b2cd8d1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/articole/[slug]/page.tsx:137", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/articole/[slug]/page.tsx:137"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1a9a1fd775cf189d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/faq/page.tsx:32", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/faq/page.tsx:32"}, "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-87412f15fd72dd32", "name": "Privileged port 127 in use", "shortDescription": {"text": "Privileged port 127 in use"}, "fullDescription": {"text": "Port 127 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b03c62ad7a0a283f", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-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-d9980d9104825b19", "name": "Dockerfile runs as root: apps/api/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/api/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-769fcff6161d5bc5", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "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-4654a46ae713f629", "name": "Dockerfile runs as root: apps/admin/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/admin/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-da606e2888be7fe1", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "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-7673561931a5dd33", "name": "Dockerfile runs as root: apps/web/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/web/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-744c132692cc6e12", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "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-24d2c78eb852832f", "name": "Insecure pattern 'cors_wildcard' in CLAUDE.md:555", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:555"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-419f7bb975baebfd", "name": "Insecure pattern 'node_child_process' in ops/bridge.js:20", "shortDescription": {"text": "Insecure pattern 'node_child_process' in ops/bridge.js:20"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c8db333e2c1ea76d", "name": "Insecure pattern 'node_child_process' in apps/api/src/modules/media/video.service.ts:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/api/src/modules/media/video.service.ts:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-293498f56cdd88d9", "name": "Insecure pattern 'node_child_process' in apps/api/src/modules/generations/audio-processor.service.ts:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/api/src/modules/generations/audio-processor.service.ts:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-999912988569293d", "name": "Insecure pattern 'node_child_process' in apps/api/src/modules/database-admin/database-admin.service.ts:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/api/src/modules/database-admin/database-admin.service.ts:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aba58e0bc7d5103a", "name": "Insecure pattern 'node_child_process' in apps/api/src/modules/collage/collage.processor.ts:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/api/src/modules/collage/collage.processor.ts:7"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ddbf3d855539a42d", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/components/order-detail-modal.tsx:1838", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/components/order-detail-modal.tsx:1838"}, "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-81fb70b658506e55", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/components/inbox/SuggestionBanner.tsx:88", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/components/inbox/SuggestionBanner.tsx:88"}, "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-016b51bf7c87bc9e", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/sections.tsx:33", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/sections.tsx:33"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43aad22f1a2544c5", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/SiteShell.tsx:68", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/SiteShell.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-4c266d89e05927a6", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/page.tsx:81", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/page.tsx:81"}, "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-ecb0aa045229d6cb", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/layout.tsx:171", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/layout.tsx:171"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ded7e654b9707dde", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/articole/[slug]/page.tsx:137", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/articole/[slug]/page.tsx:137"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d33bd13c9175518", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/faq/page.tsx:32", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/faq/page.tsx:32"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3dcdacc2d6388b91", "name": "Very large file: apps/api/src/modules/analytics/analytics.service.ts (1377 lines)", "shortDescription": {"text": "Very large file: apps/api/src/modules/analytics/analytics.service.ts (1377 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-3dafbc8358049324", "name": "Very large file: apps/api/src/modules/chat/chat.service.ts (2274 lines)", "shortDescription": {"text": "Very large file: apps/api/src/modules/chat/chat.service.ts (2274 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-41c1c755ff5fc855", "name": "Very large file: apps/api/src/modules/ai-chat/ai-chat-agent.service.ts (3735 lines)", "shortDescription": {"text": "Very large file: apps/api/src/modules/ai-chat/ai-chat-agent.service.ts (3735 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-e6a9e79187e28cba", "name": "Very large file: apps/api/src/modules/seo-pages/seo-page-templates.ts (1828 lines)", "shortDescription": {"text": "Very large file: apps/api/src/modules/seo-pages/seo-page-templates.ts (1828 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-f0dc94aa82de1c4e", "name": "Very large file: apps/api/src/modules/seo-pages/seo-page-generator.service.ts (997 lines)", "shortDescription": {"text": "Very large file: apps/api/src/modules/seo-pages/seo-page-generator.service.ts (997 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-4e159c6745c61f3c", "name": "Very large file: apps/admin/components/order-detail-modal.tsx (2150 lines)", "shortDescription": {"text": "Very large file: apps/admin/components/order-detail-modal.tsx (2150 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-8b7417415e18383e", "name": "Very large file: apps/admin/app/(dashboard)/analytics/_content.tsx (1805 lines)", "shortDescription": {"text": "Very large file: apps/admin/app/(dashboard)/analytics/_content.tsx (1805 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-edaf8122a35e787e", "name": "Very large file: apps/admin/app/(dashboard)/chat/_content.tsx (3958 lines)", "shortDescription": {"text": "Very large file: apps/admin/app/(dashboard)/chat/_content.tsx (3958 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-83c8323662689675", "name": "Very large file: apps/admin/app/(dashboard)/site/_content.tsx (2994 lines)", "shortDescription": {"text": "Very large file: apps/admin/app/(dashboard)/site/_content.tsx (2994 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-317c6d53e8c225d9", "name": "Very large file: apps/web/components/Generator.tsx (1755 lines)", "shortDescription": {"text": "Very large file: apps/web/components/Generator.tsx (1755 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-7f6fde0e2f26f86f", "name": "Very large file: apps/web/app/m/[id]/view.tsx (1712 lines)", "shortDescription": {"text": "Very large file: apps/web/app/m/[id]/view.tsx (1712 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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 413 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 12 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 242 placeholder/mock markers across 51 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.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-9e244936c6b700c4", "name": "Agent authority lacks a verifier contract: .claude/commands/start-app.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/start-app.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-47506e394b46668c", "name": "Agent authority lacks a verifier contract: .claude/skills/ops-db/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ops-db/SKILL.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-e631b7231f470af7", "name": "Agent authority lacks a verifier contract: .claude/skills/ops-errors/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ops-errors/SKILL.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-0f3279dfaea764e1", "name": "Agent authority lacks a verifier contract: .claude/skills/start-app/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/start-app/SKILL.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-cfcc0df56d711180", "name": "Agent authority lacks a verifier contract: .claude/skills/ops-payment/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ops-payment/SKILL.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-1183d94efe4833d4", "name": "Agent authority lacks a verifier contract: .claude/skills/ops-client/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ops-client/SKILL.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-608471c8f94a1e69", "name": "Commented-code block (8 lines) in apps/api/src/database/database.module.ts:36", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/database/database.module.ts:36"}, "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-30be754f031a5e36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/mailer/providers/mailgun.provider.ts:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/mailer/providers/mailgun.provider.ts:55"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2ec8d544dd47edf3", "name": "Commented-code block (6 lines) in apps/api/src/modules/settings/settings-schema.ts:206", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/modules/settings/settings-schema.ts:206"}, "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-27bde48033b2e412", "name": "Commented-code block (5 lines) in apps/api/src/modules/suno/providers/suno.real.provider.ts:667", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/modules/suno/providers/suno.real.provider.ts:667"}, "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-f359eaadc87732d3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/suno/providers/suno.real.provider.ts:193", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/suno/providers/suno.real.provider.ts:193"}, "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-bdb9ec17706c48b0", "name": "Commented-code block (5 lines) in apps/api/src/modules/analytics/ad-spend.service.ts:321", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/modules/analytics/ad-spend.service.ts:321"}, "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-05dad596e9b63f4f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/analytics/ad-spend.service.ts:151", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/analytics/ad-spend.service.ts:151"}, "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-6cc7c66923819830", "name": "Commented-code block (8 lines) in apps/api/src/modules/analytics/forwarders.ts:230", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/modules/analytics/forwarders.ts:230"}, "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-7c8e564408a97313", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/suggestions/suggestions.service.ts:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/suggestions/suggestions.service.ts:100"}, "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-96b9275bd10da848", "name": "Commented-code block (5 lines) in apps/api/src/modules/generations/generations.processor.ts:208", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/modules/generations/generations.processor.ts:208"}, "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-ec6159bdc023d2d4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/generations/audio-processor.service.ts:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/generations/audio-processor.service.ts:96"}, "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-69f82aaef51dd121", "name": "Commented-code block (9 lines) in apps/api/src/modules/chat/chat.gateway.ts:257", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/modules/chat/chat.gateway.ts:257"}, "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-3bba2e8633fcfd72", "name": "Commented-code block (5 lines) in apps/api/src/modules/chat/chat.service.ts:378", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/modules/chat/chat.service.ts:378"}, "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-16425c27371076a6", "name": "Commented-code block (7 lines) in apps/api/src/modules/meta-capi/meta-capi.controller.ts:96", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/modules/meta-capi/meta-capi.controller.ts:96"}, "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-fdf6ad2eafbf7ce7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/meta-capi/meta-capi.service.ts:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/meta-capi/meta-capi.service.ts:124"}, "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-86fb420075bc88a9", "name": "Commented-code block (6 lines) in apps/api/src/modules/lyrics/lyrics.module.ts:717", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/modules/lyrics/lyrics.module.ts:717"}, "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-413b960252c08bb5", "name": "Commented-code block (5 lines) in apps/api/src/modules/admin/admin-orders.controller.ts:131", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/modules/admin/admin-orders.controller.ts:131"}, "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-c6fd277a8cbe1774", "name": "Commented-code block (9 lines) in apps/api/src/modules/admin/admin.controller.ts:262", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/modules/admin/admin.controller.ts:262"}, "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-795cd14f12596dc6", "name": "Commented-code block (6 lines) in apps/api/src/modules/ai-chat/ai-chat-agent.service.ts:239", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/modules/ai-chat/ai-chat-agent.service.ts:239"}, "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-bcc1fe0bd0bd2890", "name": "Commented-code block (5 lines) in apps/api/src/modules/payments/payments.controller.ts:95", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/modules/payments/payments.controller.ts:95"}, "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-457d57db911da395", "name": "Commented-code block (5 lines) in apps/api/src/modules/payments/payments.service.ts:70", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/modules/payments/payments.service.ts: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-ab53fd029e4b2d15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/seo-pages/seo-page-generator.service.ts:155", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/seo-pages/seo-page-generator.service.ts:155"}, "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-6fc8106268f47464", "name": "Commented-code block (5 lines) in apps/api/src/modules/sites/sites.service.ts:92", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/modules/sites/sites.service.ts:92"}, "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-d8fd9568461b9d72", "name": "Commented-code block (7 lines) in apps/api/src/modules/sites/sites.controller.ts:217", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/modules/sites/sites.controller.ts:217"}, "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-b2a60349b09c9099", "name": "Commented-code block (5 lines) in apps/api/src/modules/sites/site-samples.service.ts:155", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/modules/sites/site-samples.service.ts:155"}, "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-1c3e741eb9a2ef76", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/sites/site-samples.service.ts:539", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/sites/site-samples.service.ts:539"}, "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-d3383f60564c7522", "name": "Commented-code block (5 lines) in apps/admin/app/(dashboard)/chat/_content.tsx:623", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/app/(dashboard)/chat/_content.tsx:623"}, "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-3c346ed7150d5765", "name": "Commented-code block (5 lines) in apps/admin/app/(dashboard)/site/_content.tsx:1584", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/app/(dashboard)/site/_content.tsx:1584"}, "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-2e9b9744eeb4781e", "name": "Commented-code block (5 lines) in apps/admin/lib/seed-categories.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/lib/seed-categories.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb3ea350e3635493", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/lib/api/database.api.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/lib/api/database.api.ts:40"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-016c49ac0ec5abab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/lib/api/mail.api.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/lib/api/mail.api.ts:88"}, "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-1722ebe495abc65c", "name": "Commented-code block (13 lines) in apps/admin/lib/http/client.ts:97", "shortDescription": {"text": "Commented-code block (13 lines) in apps/admin/lib/http/client.ts:97"}, "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-fc95e4e5f095ce64", "name": "Commented-code block (5 lines) in apps/web/components/sections.tsx:126", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/sections.tsx:126"}, "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-430063e907729fe0", "name": "Commented-code block (5 lines) in apps/web/components/Generator.tsx:277", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/Generator.tsx:277"}, "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-ccaadf0a049c7b39", "name": "Commented-code block (5 lines) in apps/web/components/ChatWidget.tsx:339", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/ChatWidget.tsx:339"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6aaa27d14564c442", "name": "Commented-code block (16 lines) in apps/web/components/OpenReplay.tsx:59", "shortDescription": {"text": "Commented-code block (16 lines) in apps/web/components/OpenReplay.tsx:59"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a8ea77bbeed8b0b3", "name": "Commented-code block (5 lines) in apps/web/components/DemosPopup.tsx:189", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/DemosPopup.tsx:189"}, "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-63647cf56338d796", "name": "Commented-code block (5 lines) in apps/web/app/layout.tsx:147", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/app/layout.tsx:147"}, "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-86f0e1d864529e50", "name": "Commented-code block (5 lines) in apps/web/app/istoric/page.tsx:53", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/app/istoric/page.tsx:53"}, "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-721743b6517e28e2", "name": "Commented-code block (5 lines) in apps/web/lib/tracking.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/lib/tracking.ts:182"}, "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-47d48e0da5e8c29f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/site-config.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/site-config.ts:47"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6a97764c1d19027b", "name": "Legacy-named symbol `mc_consent_v1` in apps/web/lib/tracker.ts:7", "shortDescription": {"text": "Legacy-named symbol `mc_consent_v1` in apps/web/lib/tracker.ts:7"}, "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-7eaa81644a6d0372", "name": "Commented-code block (6 lines) in apps/web/lib/tracker.ts:353", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/lib/tracker.ts:353"}, "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-9a82cf7d16234d20", "name": "21 env vars used in code but missing from .env.example", "shortDescription": {"text": "21 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `API_INTERNAL_URL`, `BACKUPS_DIR`, `DEFAULT_SITE_DOMAIN`, `DEFAULT_SITE_NAME`, `IPINFO_TOKEN`, `LOGS_DIR`, `LOG_LEVEL`, `MAIL_ATTACH_DIR` + 13 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-b2e27245b75416db", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/modules/suggestions/suggestions.service.ts", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/modules/suggestions/suggestions.service.ts:100)"}, "fullDescription": {"text": "`apps/api/src/modules/suggestions/suggestions.service.ts:100` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-df68e9f8de5b71bc", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/modules/lyrics/lyrics.module.ts:730)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/modules/lyrics/lyrics.module.ts:730)"}, "fullDescription": {"text": "`apps/api/src/modules/lyrics/lyrics.module.ts:730` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-d394b18b3ac44aac", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/modules/seo-pages/seo-page-generator.servi", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/modules/seo-pages/seo-page-generator.service.ts:155)"}, "fullDescription": {"text": "`apps/api/src/modules/seo-pages/seo-page-generator.service.ts:155` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-4cf9d68d869db74e", "name": "Dangling fetch: POST /ops-chat/terminal-input (apps/admin/app/(dashboard)/terminal/_content.tsx:167)", "shortDescription": {"text": "Dangling fetch: POST /ops-chat/terminal-input (apps/admin/app/(dashboard)/terminal/_content.tsx:167)"}, "fullDescription": {"text": "`apps/admin/app/(dashboard)/terminal/_content.tsx:167` calls `POST /ops-chat/terminal-input` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ops-chat/terminal-input`\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-049c61430bf743f5", "name": "Dangling fetch: POST /ops-chat/chat (apps/admin/app/(dashboard)/terminal/_content.tsx:324)", "shortDescription": {"text": "Dangling fetch: POST /ops-chat/chat (apps/admin/app/(dashboard)/terminal/_content.tsx:324)"}, "fullDescription": {"text": "`apps/admin/app/(dashboard)/terminal/_content.tsx:324` calls `POST /ops-chat/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ops-chat/chat`\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-2e7673fe05fdaad2", "name": "Dangling fetch: POST /guest-sessions (apps/web/lib/api.ts:113)", "shortDescription": {"text": "Dangling fetch: POST /guest-sessions (apps/web/lib/api.ts:113)"}, "fullDescription": {"text": "`apps/web/lib/api.ts:113` calls `POST /guest-sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/guest-sessions`\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-45d5ae7441954b95", "name": "Dangling fetch: POST /generations (apps/web/lib/api.ts:348)", "shortDescription": {"text": "Dangling fetch: POST /generations (apps/web/lib/api.ts:348)"}, "fullDescription": {"text": "`apps/web/lib/api.ts:348` calls `POST /generations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/generations`\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-95f0a5d8489cc10c", "name": "Dangling fetch: GET /generations/${id} (apps/web/lib/api.ts:353)", "shortDescription": {"text": "Dangling fetch: GET /generations/${id} (apps/web/lib/api.ts:353)"}, "fullDescription": {"text": "`apps/web/lib/api.ts:353` calls `GET /generations/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/generations/<p>`\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-791be45c2616ec45", "name": "Dangling fetch: GET /public/site-demos (apps/web/lib/api.ts:382)", "shortDescription": {"text": "Dangling fetch: GET /public/site-demos (apps/web/lib/api.ts:382)"}, "fullDescription": {"text": "`apps/web/lib/api.ts:382` calls `GET /public/site-demos` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/public/site-demos`\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-2cad743ac7e67431", "name": "Dangling fetch: POST /generations/${id}/retry (apps/web/lib/api.ts:409)", "shortDescription": {"text": "Dangling fetch: POST /generations/${id}/retry (apps/web/lib/api.ts:409)"}, "fullDescription": {"text": "`apps/web/lib/api.ts:409` calls `POST /generations/${id}/retry` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/generations/<p>/retry`\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-4b1988b04ac2a955", "name": "Dangling fetch: POST /generations/${id}/unlock (apps/web/lib/api.ts:411)", "shortDescription": {"text": "Dangling fetch: POST /generations/${id}/unlock (apps/web/lib/api.ts:411)"}, "fullDescription": {"text": "`apps/web/lib/api.ts:411` calls `POST /generations/${id}/unlock` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/generations/<p>/unlock`\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-40668609391454e8", "name": "Dangling fetch: POST /generations/${id}/unlock-with-gift (apps/web/lib/api.ts:416)", "shortDescription": {"text": "Dangling fetch: POST /generations/${id}/unlock-with-gift (apps/web/lib/api.ts:416)"}, "fullDescription": {"text": "`apps/web/lib/api.ts:416` calls `POST /generations/${id}/unlock-with-gift` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/generations/<p>/unlock-with-gift`\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-8c9c1d721dab8050", "name": "Dangling fetch: POST /generations/${generationId}/unlock-check (apps/web/lib/api.ts:607)", "shortDescription": {"text": "Dangling fetch: POST /generations/${generationId}/unlock-check (apps/web/lib/api.ts:607)"}, "fullDescription": {"text": "`apps/web/lib/api.ts:607` calls `POST /generations/${generationId}/unlock-check` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/generations/<p>/unlock-check`\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-6051edba0518d0aa", "name": "Unused endpoint: GET /admin/mail/accounts", "shortDescription": {"text": "Unused endpoint: GET /admin/mail/accounts"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `GET /admin/mail/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-8d0794e0f95c47d8", "name": "Unused endpoint: POST /admin/mail/accounts", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/accounts"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/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-b5bb8cc7673218a6", "name": "Unused endpoint: PATCH /admin/mail/accounts/:id", "shortDescription": {"text": "Unused endpoint: PATCH /admin/mail/accounts/:id"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `PATCH /admin/mail/accounts/: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-7f4bbaa707b04394", "name": "Unused endpoint: DELETE /admin/mail/accounts/:id", "shortDescription": {"text": "Unused endpoint: DELETE /admin/mail/accounts/:id"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `DELETE /admin/mail/accounts/: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-809b5bec7087a8c2", "name": "Unused endpoint: POST /admin/mail/accounts/test", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/accounts/test"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/accounts/test` 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-f0822e8e21934495", "name": "Unused endpoint: POST /admin/mail/accounts/:id/test", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/accounts/:id/test"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/accounts/:id/test` 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-72a899c2e2f0c16f", "name": "Unused endpoint: POST /admin/mail/accounts/:id/sync", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/accounts/:id/sync"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/accounts/:id/sync` 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-250f612875eb2d40", "name": "Unused endpoint: GET /admin/mail/accounts/:id/folders", "shortDescription": {"text": "Unused endpoint: GET /admin/mail/accounts/:id/folders"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `GET /admin/mail/accounts/:id/folders` 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-9fc5415bd1f9142b", "name": "Unused endpoint: GET /admin/mail/messages", "shortDescription": {"text": "Unused endpoint: GET /admin/mail/messages"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `GET /admin/mail/messages` 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-817247e2c1e05065", "name": "Unused endpoint: GET /admin/mail/threads/:threadId", "shortDescription": {"text": "Unused endpoint: GET /admin/mail/threads/:threadId"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `GET /admin/mail/threads/:threadId` 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-7360273f36e99b73", "name": "Unused endpoint: GET /admin/mail/messages/:id", "shortDescription": {"text": "Unused endpoint: GET /admin/mail/messages/:id"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `GET /admin/mail/messages/: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-6f08641ed235f92f", "name": "Unused endpoint: PATCH /admin/mail/messages/:id", "shortDescription": {"text": "Unused endpoint: PATCH /admin/mail/messages/:id"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `PATCH /admin/mail/messages/: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-62295d22a59c7199", "name": "Unused endpoint: POST /admin/mail/messages/:id/reply", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/messages/:id/reply"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/messages/:id/reply` 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-f9148f21e788bf5f", "name": "Unused endpoint: POST /admin/mail/translate-out", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/translate-out"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/translate-out` 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-598dcf962e76dc3d", "name": "Unused endpoint: POST /admin/mail/messages/:id/translate", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/messages/:id/translate"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/messages/:id/translate` 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-5dc8fe1a42ee0658", "name": "Unused endpoint: POST /admin/mail/messages/:id/archive", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/messages/:id/archive"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/messages/:id/archive` 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-bb6361edd6da22fb", "name": "Unused endpoint: POST /admin/mail/messages/:id/unarchive", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/messages/:id/unarchive"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/messages/:id/unarchive` 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-6d595771bb2c275b", "name": "Unused endpoint: DELETE /admin/mail/messages/:id", "shortDescription": {"text": "Unused endpoint: DELETE /admin/mail/messages/:id"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `DELETE /admin/mail/messages/: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-e2cba3a218e30daa", "name": "Unused endpoint: POST /admin/mail/suggestions/:id/send", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/suggestions/:id/send"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/suggestions/:id/send` 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-6520818f3f65708b", "name": "Unused endpoint: POST /admin/mail/suggestions/:id/dismiss", "shortDescription": {"text": "Unused endpoint: POST /admin/mail/suggestions/:id/dismiss"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `POST /admin/mail/suggestions/:id/dismiss` 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-9c03841f7a960ea8", "name": "Unused endpoint: GET /admin/mail/attachments/:id", "shortDescription": {"text": "Unused endpoint: GET /admin/mail/attachments/:id"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `GET /admin/mail/attachments/: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-963928480b15bc5b", "name": "Unused endpoint: GET /admin/mail/unread-total", "shortDescription": {"text": "Unused endpoint: GET /admin/mail/unread-total"}, "fullDescription": {"text": "`apps/api/src/modules/mail/mail.controller.ts` declares `GET /admin/mail/unread-total` 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-0a36563c82782990", "name": "Unused endpoint: POST /suno/callback", "shortDescription": {"text": "Unused endpoint: POST /suno/callback"}, "fullDescription": {"text": "`apps/api/src/modules/suno/suno.controller.ts` declares `POST /suno/callback` 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-e1f3db66ddc50202", "name": "Unused endpoint: GET /auth/magic-link/consume", "shortDescription": {"text": "Unused endpoint: GET /auth/magic-link/consume"}, "fullDescription": {"text": "`apps/api/src/modules/auth/auth.controller.ts` declares `GET /auth/magic-link/consume` 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-8817b45a1d80ef52", "name": "Unused endpoint: POST /auth/locale", "shortDescription": {"text": "Unused endpoint: POST /auth/locale"}, "fullDescription": {"text": "`apps/api/src/modules/auth/auth.controller.ts` declares `POST /auth/locale` 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-927752f4a0639817", "name": "Unused endpoint: POST /admin/ai-assistant/chat", "shortDescription": {"text": "Unused endpoint: POST /admin/ai-assistant/chat"}, "fullDescription": {"text": "`apps/api/src/modules/ai-assistant/ai-assistant.controller.ts` declares `POST /admin/ai-assistant/chat` 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-f23ed081f1885e39", "name": "Unused endpoint: GET /analytics/whoami", "shortDescription": {"text": "Unused endpoint: GET /analytics/whoami"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/whoami` 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-3a29959244c7dcf2", "name": "Unused endpoint: POST /analytics/track", "shortDescription": {"text": "Unused endpoint: POST /analytics/track"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `POST /analytics/track` 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-3bc815fb099eeeb6", "name": "Unused endpoint: POST /analytics/track/batch", "shortDescription": {"text": "Unused endpoint: POST /analytics/track/batch"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `POST /analytics/track/batch` 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-2be4f15c89170885", "name": "Unused endpoint: GET /analytics/ad-spend", "shortDescription": {"text": "Unused endpoint: GET /analytics/ad-spend"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/ad-spend` 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-93095092fa4a884b", "name": "Unused endpoint: POST /analytics/ad-spend/sync", "shortDescription": {"text": "Unused endpoint: POST /analytics/ad-spend/sync"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `POST /analytics/ad-spend/sync` 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-b22b0ddda467f51e", "name": "Unused endpoint: GET /analytics/overview", "shortDescription": {"text": "Unused endpoint: GET /analytics/overview"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/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-038735f584664215", "name": "Unused endpoint: GET /analytics/time-series", "shortDescription": {"text": "Unused endpoint: GET /analytics/time-series"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/time-series` 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-101b3ca4043d83d7", "name": "Unused endpoint: GET /analytics/funnel", "shortDescription": {"text": "Unused endpoint: GET /analytics/funnel"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/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-fe0661a06e488048", "name": "Unused endpoint: GET /analytics/sources", "shortDescription": {"text": "Unused endpoint: GET /analytics/sources"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/sources` 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-d9c5235c51d834fe", "name": "Unused endpoint: GET /analytics/revenue-by-source", "shortDescription": {"text": "Unused endpoint: GET /analytics/revenue-by-source"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/revenue-by-source` 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-aac35ba6957d3cfd", "name": "Unused endpoint: GET /analytics/revenue-by-campaign", "shortDescription": {"text": "Unused endpoint: GET /analytics/revenue-by-campaign"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/revenue-by-campaign` 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-b37aceadd8d8fc74", "name": "Unused endpoint: GET /analytics/top-pages", "shortDescription": {"text": "Unused endpoint: GET /analytics/top-pages"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/top-pages` 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-df4eb5c1d5180ddd", "name": "Unused endpoint: GET /analytics/devices", "shortDescription": {"text": "Unused endpoint: GET /analytics/devices"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/devices` 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-016b3f749d6a1113", "name": "Unused endpoint: GET /analytics/users", "shortDescription": {"text": "Unused endpoint: GET /analytics/users"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/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-95795f50e8f6bda6", "name": "Unused endpoint: GET /analytics/stripe-reconciliation", "shortDescription": {"text": "Unused endpoint: GET /analytics/stripe-reconciliation"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/stripe-reconciliation` 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-7ad3ffccc2707aa1", "name": "Unused endpoint: GET /analytics/pixel-cross-check", "shortDescription": {"text": "Unused endpoint: GET /analytics/pixel-cross-check"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/pixel-cross-check` 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-abe85303bd7aa7c8", "name": "Unused endpoint: GET /analytics/countries", "shortDescription": {"text": "Unused endpoint: GET /analytics/countries"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/countries` 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-f16243d2571b60b0", "name": "Unused endpoint: GET /analytics/browsers", "shortDescription": {"text": "Unused endpoint: GET /analytics/browsers"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/browsers` 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-6ca033fd7ff77cbc", "name": "Unused endpoint: GET /analytics/os", "shortDescription": {"text": "Unused endpoint: GET /analytics/os"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/os` 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-1ae7da59005743fc", "name": "Unused endpoint: GET /analytics/screens", "shortDescription": {"text": "Unused endpoint: GET /analytics/screens"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/screens` 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-0bd5ecc3c79eede3", "name": "Unused endpoint: GET /analytics/languages", "shortDescription": {"text": "Unused endpoint: GET /analytics/languages"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/languages` 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-ad509ff5130504c5", "name": "Unused endpoint: GET /analytics/web-vitals", "shortDescription": {"text": "Unused endpoint: GET /analytics/web-vitals"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/web-vitals` 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-bbfe55b6c1473e09", "name": "Unused endpoint: GET /analytics/sessions", "shortDescription": {"text": "Unused endpoint: GET /analytics/sessions"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/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-8969085a41f87f63", "name": "Unused endpoint: GET /analytics/bots", "shortDescription": {"text": "Unused endpoint: GET /analytics/bots"}, "fullDescription": {"text": "`apps/api/src/modules/analytics/analytics.controller.ts` declares `GET /analytics/bots` 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/19277"}, "properties": {"repository": "serban2702/manelecadou", "repoUrl": "https://github.com/serban2702/manelecadou", "branch": "main"}, "results": [{"ruleId": "scanner-3834d17510f97ae6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ops/bridge.js:272"}, "properties": {"repobilityId": "31a0711820478f69", "scanner": "scanner-primary", "fingerprint": "3834d17510f97ae6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-00f46b803cf9bd3d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/main.ts:89"}, "properties": {"repobilityId": "1df3dab31f34a60f", "scanner": "scanner-primary", "fingerprint": "00f46b803cf9bd3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c115e1206eecc99a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/components/scope-banner.tsx:109"}, "properties": {"repobilityId": "b665b432a62c17d8", "scanner": "scanner-primary", "fingerprint": "c115e1206eecc99a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a774f3ec61913874", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/components/icon-picker.tsx:294"}, "properties": {"repobilityId": "d701d2050e7e127b", "scanner": "scanner-primary", "fingerprint": "a774f3ec61913874", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9c62f55236c993d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/components/order-detail-modal.tsx:1299"}, "properties": {"repobilityId": "16abad769febab6b", "scanner": "scanner-primary", "fingerprint": "b9c62f55236c993d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3883a31ee4daf755", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/components/order-detail-modal.tsx:1838"}, "properties": {"repobilityId": "6ba19fc03c3dd9fb", "scanner": "scanner-primary", "fingerprint": "3883a31ee4daf755", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9db8f475275acbe5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/components/inbox/SuggestionBanner.tsx:88"}, "properties": {"repobilityId": "bd2389984055be64", "scanner": "scanner-primary", "fingerprint": "9db8f475275acbe5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bbcc25e97ce9de21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/layout.tsx:227"}, "properties": {"repobilityId": "80bc8da2f094a32d", "scanner": "scanner-primary", "fingerprint": "bbcc25e97ce9de21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49f9eab5a4e4a791", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/suno/_content.tsx:285"}, "properties": {"repobilityId": "866d849b8563514b", "scanner": "scanner-primary", "fingerprint": "49f9eab5a4e4a791", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc2be90f435836b2", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/admin/app/(dashboard)/analytics/_content.tsx:1425"}, "properties": {"repobilityId": "463e3b8d7e9b96d1", "scanner": "scanner-primary", "fingerprint": "fc2be90f435836b2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7dd4520d4653938f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/analytics/_content.tsx:376"}, "properties": {"repobilityId": "6a46c01d5a76a12f", "scanner": "scanner-primary", "fingerprint": "7dd4520d4653938f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c3f92f1b8df717c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/generations/_content.tsx:172"}, "properties": {"repobilityId": "7dc4ea2a2c91630d", "scanner": "scanner-primary", "fingerprint": "c3f92f1b8df717c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7aea3eb163dea0e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/site-demos/_content.tsx:209"}, "properties": {"repobilityId": "98a22768ebc5b118", "scanner": "scanner-primary", "fingerprint": "7aea3eb163dea0e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1a9906ac6223e36", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/errors/_content.tsx:266"}, "properties": {"repobilityId": "fb1c5c669238c6a7", "scanner": "scanner-primary", "fingerprint": "d1a9906ac6223e36", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f410617be92e8bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/chat/_content.tsx:788"}, "properties": {"repobilityId": "1a5d743e544a52f3", "scanner": "scanner-primary", "fingerprint": "6f410617be92e8bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e4ad47e9d05b911", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/emails/_content.tsx:262"}, "properties": {"repobilityId": "b5e52f78314cc328", "scanner": "scanner-primary", "fingerprint": "1e4ad47e9d05b911", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8020f62d0c489591", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/marketing/_content.tsx:171"}, "properties": {"repobilityId": "be34f961109676a2", "scanner": "scanner-primary", "fingerprint": "8020f62d0c489591", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7522d2d39deb94bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/site/_content.tsx:688"}, "properties": {"repobilityId": "5be46d152998ea43", "scanner": "scanner-primary", "fingerprint": "7522d2d39deb94bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-63e5b6c2d7b8e508", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/terminal/_content.tsx:569"}, "properties": {"repobilityId": "f1a7202701e4ccfd", "scanner": "scanner-primary", "fingerprint": "63e5b6c2d7b8e508", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e7206e9e3d0f802", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/payments/_content.tsx:153"}, "properties": {"repobilityId": "1063554b2162f134", "scanner": "scanner-primary", "fingerprint": "6e7206e9e3d0f802", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b41253509203705", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/ai-monitor/_content.tsx:284"}, "properties": {"repobilityId": "4f237296aeed3b24", "scanner": "scanner-primary", "fingerprint": "4b41253509203705", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f94437aa900cc304", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/promo/_content.tsx:237"}, "properties": {"repobilityId": "e765ad0bc5cd915d", "scanner": "scanner-primary", "fingerprint": "f94437aa900cc304", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1a296f8f51ddf58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/sites/_content.tsx:156"}, "properties": {"repobilityId": "4673a1fefe752b3a", "scanner": "scanner-primary", "fingerprint": "a1a296f8f51ddf58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9aaaf88416917e70", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/inbox/_content.tsx:242"}, "properties": {"repobilityId": "b46d62da816940c7", "scanner": "scanner-primary", "fingerprint": "9aaaf88416917e70", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4417f9d8eda3143c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/inbox/accounts/_content.tsx:81"}, "properties": {"repobilityId": "9c01d495b6a9273a", "scanner": "scanner-primary", "fingerprint": "4417f9d8eda3143c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-291040b548cc4e85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/app/(dashboard)/inbox/knowledge/_content.tsx:111"}, "properties": {"repobilityId": "cb8b9a936bf44d6f", "scanner": "scanner-primary", "fingerprint": "291040b548cc4e85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b13a74bf141ef77", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/components/sections.tsx:232"}, "properties": {"repobilityId": "f9812858d0d30397", "scanner": "scanner-primary", "fingerprint": "0b13a74bf141ef77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3668fe2337005b94", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/sections.tsx:33"}, "properties": {"repobilityId": "bde2ab19b11932dc", "scanner": "scanner-primary", "fingerprint": "3668fe2337005b94", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fc93bc319c6ec941", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/SiteShell.tsx:68"}, "properties": {"repobilityId": "827e6c17fdc3b814", "scanner": "scanner-primary", "fingerprint": "fc93bc319c6ec941", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9e7eb3cca1109ca7", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/components/RouletteWheel.tsx:145"}, "properties": {"repobilityId": "707eda430642ed9f", "scanner": "scanner-primary", "fingerprint": "9e7eb3cca1109ca7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e49e6383a0a43da9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/page.tsx:81"}, "properties": {"repobilityId": "8feacc27aab13756", "scanner": "scanner-primary", "fingerprint": "e49e6383a0a43da9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-379747909220cd1d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/layout.tsx:171"}, "properties": {"repobilityId": "c0c2a3988fe8adb9", "scanner": "scanner-primary", "fingerprint": "379747909220cd1d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c50d5aa09b2cd8d1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/articole/[slug]/page.tsx:137"}, "properties": {"repobilityId": "b11402e7d9a1c271", "scanner": "scanner-primary", "fingerprint": "c50d5aa09b2cd8d1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1a9a1fd775cf189d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/faq/page.tsx:32"}, "properties": {"repobilityId": "94f96956b98aee2a", "scanner": "scanner-primary", "fingerprint": "1a9a1fd775cf189d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-87412f15fd72dd32", "level": "warning", "message": {"text": "Privileged port 127 in use"}, "properties": {"repobilityId": "afafb77f13b4bf59", "scanner": "scanner-primary", "fingerprint": "87412f15fd72dd32", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b03c62ad7a0a283f", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-slim"}, "properties": {"repobilityId": "e3bebc09e73aca45", "scanner": "scanner-primary", "fingerprint": "b03c62ad7a0a283f", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ops/Dockerfile"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-d9980d9104825b19", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/api/Dockerfile"}, "properties": {"repobilityId": "e591b11d8a0c1fe7", "scanner": "scanner-primary", "fingerprint": "d9980d9104825b19", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-769fcff6161d5bc5", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "ad970695ed24beea", "scanner": "scanner-primary", "fingerprint": "769fcff6161d5bc5", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-769fcff6161d5bc5", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "90eea567315021c1", "scanner": "scanner-primary", "fingerprint": "769fcff6161d5bc5", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-769fcff6161d5bc5", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "7539e933448eace9", "scanner": "scanner-primary", "fingerprint": "769fcff6161d5bc5", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-4654a46ae713f629", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/admin/Dockerfile"}, "properties": {"repobilityId": "cae29b04ac99f84e", "scanner": "scanner-primary", "fingerprint": "4654a46ae713f629", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-da606e2888be7fe1", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "bfbe3274246ce25e", "scanner": "scanner-primary", "fingerprint": "da606e2888be7fe1", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-da606e2888be7fe1", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "039d1d54bce9d831", "scanner": "scanner-primary", "fingerprint": "da606e2888be7fe1", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/Dockerfile"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-da606e2888be7fe1", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "1177f3bb5c8092c9", "scanner": "scanner-primary", "fingerprint": "da606e2888be7fe1", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/Dockerfile"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-7673561931a5dd33", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/web/Dockerfile"}, "properties": {"repobilityId": "d68d7937b96d047d", "scanner": "scanner-primary", "fingerprint": "7673561931a5dd33", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-744c132692cc6e12", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "2ecf2ef31763afb8", "scanner": "scanner-primary", "fingerprint": "744c132692cc6e12", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-744c132692cc6e12", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "e01cf5e7c82be90d", "scanner": "scanner-primary", "fingerprint": "744c132692cc6e12", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-744c132692cc6e12", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "907a39a084c96a09", "scanner": "scanner-primary", "fingerprint": "744c132692cc6e12", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 36}}}]}, {"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-24d2c78eb852832f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:555"}, "properties": {"repobilityId": "357ad155aeba7b11", "scanner": "scanner-primary", "fingerprint": "24d2c78eb852832f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 555}}}]}, {"ruleId": "scanner-419f7bb975baebfd", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in ops/bridge.js:20"}, "properties": {"repobilityId": "c597c3064775e438", "scanner": "scanner-primary", "fingerprint": "419f7bb975baebfd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ops/bridge.js"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-c8db333e2c1ea76d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/api/src/modules/media/video.service.ts:3"}, "properties": {"repobilityId": "8143c3c96e66e1a3", "scanner": "scanner-primary", "fingerprint": "c8db333e2c1ea76d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/modules/media/video.service.ts"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-293498f56cdd88d9", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/api/src/modules/generations/audio-processor.service.ts:3"}, "properties": {"repobilityId": "ecee6dfb39a0363e", "scanner": "scanner-primary", "fingerprint": "293498f56cdd88d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/modules/generations/audio-processor.service.ts"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-999912988569293d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/api/src/modules/database-admin/database-admin.service.ts:5"}, "properties": {"repobilityId": "1f4f299d4eb288db", "scanner": "scanner-primary", "fingerprint": "999912988569293d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/modules/database-admin/database-admin.service.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-aba58e0bc7d5103a", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/api/src/modules/collage/collage.processor.ts:7"}, "properties": {"repobilityId": "8c7be9211d16cbe1", "scanner": "scanner-primary", "fingerprint": "aba58e0bc7d5103a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/modules/collage/collage.processor.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-ddbf3d855539a42d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/components/order-detail-modal.tsx:1838"}, "properties": {"repobilityId": "6fb4f0c71ed4cab1", "scanner": "scanner-primary", "fingerprint": "ddbf3d855539a42d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/components/order-detail-modal.tsx"}, "region": {"startLine": 1838}}}]}, {"ruleId": "scanner-81fb70b658506e55", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/components/inbox/SuggestionBanner.tsx:88"}, "properties": {"repobilityId": "0d01c35f376c3186", "scanner": "scanner-primary", "fingerprint": "81fb70b658506e55", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/components/inbox/SuggestionBanner.tsx"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-016b51bf7c87bc9e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/sections.tsx:33"}, "properties": {"repobilityId": "c17074ec66cdcc87", "scanner": "scanner-primary", "fingerprint": "016b51bf7c87bc9e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/components/sections.tsx"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-43aad22f1a2544c5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/SiteShell.tsx:68"}, "properties": {"repobilityId": "5c3f2cc5afd147a2", "scanner": "scanner-primary", "fingerprint": "43aad22f1a2544c5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/components/SiteShell.tsx"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-4c266d89e05927a6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/page.tsx:81"}, "properties": {"repobilityId": "d7f5e29beca9a07a", "scanner": "scanner-primary", "fingerprint": "4c266d89e05927a6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/app/page.tsx"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-ecb0aa045229d6cb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/layout.tsx:171"}, "properties": {"repobilityId": "9e48a86129166999", "scanner": "scanner-primary", "fingerprint": "ecb0aa045229d6cb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/app/layout.tsx"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-ded7e654b9707dde", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/articole/[slug]/page.tsx:137"}, "properties": {"repobilityId": "b3cb98c8d64ba33d", "scanner": "scanner-primary", "fingerprint": "ded7e654b9707dde", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/app/articole/[slug]/page.tsx"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-2d33bd13c9175518", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/faq/page.tsx:32"}, "properties": {"repobilityId": "83704fd7fa772f00", "scanner": "scanner-primary", "fingerprint": "2d33bd13c9175518", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/app/faq/page.tsx"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-3dcdacc2d6388b91", "level": "note", "message": {"text": "Very large file: apps/api/src/modules/analytics/analytics.service.ts (1377 lines)"}, "properties": {"repobilityId": "dbb2633f95c8e56b", "scanner": "scanner-primary", "fingerprint": "3dcdacc2d6388b91", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3dafbc8358049324", "level": "note", "message": {"text": "Very large file: apps/api/src/modules/chat/chat.service.ts (2274 lines)"}, "properties": {"repobilityId": "061cbca9a644b720", "scanner": "scanner-primary", "fingerprint": "3dafbc8358049324", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-41c1c755ff5fc855", "level": "note", "message": {"text": "Very large file: apps/api/src/modules/ai-chat/ai-chat-agent.service.ts (3735 lines)"}, "properties": {"repobilityId": "03381b1665c83a41", "scanner": "scanner-primary", "fingerprint": "41c1c755ff5fc855", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e6a9e79187e28cba", "level": "note", "message": {"text": "Very large file: apps/api/src/modules/seo-pages/seo-page-templates.ts (1828 lines)"}, "properties": {"repobilityId": "039aec167bab2d1d", "scanner": "scanner-primary", "fingerprint": "e6a9e79187e28cba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f0dc94aa82de1c4e", "level": "note", "message": {"text": "Very large file: apps/api/src/modules/seo-pages/seo-page-generator.service.ts (997 lines)"}, "properties": {"repobilityId": "be1cf58dad91a5c6", "scanner": "scanner-primary", "fingerprint": "f0dc94aa82de1c4e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4e159c6745c61f3c", "level": "note", "message": {"text": "Very large file: apps/admin/components/order-detail-modal.tsx (2150 lines)"}, "properties": {"repobilityId": "de2295d617e844d4", "scanner": "scanner-primary", "fingerprint": "4e159c6745c61f3c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8b7417415e18383e", "level": "note", "message": {"text": "Very large file: apps/admin/app/(dashboard)/analytics/_content.tsx (1805 lines)"}, "properties": {"repobilityId": "c580d73f8a477a82", "scanner": "scanner-primary", "fingerprint": "8b7417415e18383e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-edaf8122a35e787e", "level": "note", "message": {"text": "Very large file: apps/admin/app/(dashboard)/chat/_content.tsx (3958 lines)"}, "properties": {"repobilityId": "648ca7ab81e838e1", "scanner": "scanner-primary", "fingerprint": "edaf8122a35e787e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-83c8323662689675", "level": "note", "message": {"text": "Very large file: apps/admin/app/(dashboard)/site/_content.tsx (2994 lines)"}, "properties": {"repobilityId": "4340645df54735f7", "scanner": "scanner-primary", "fingerprint": "83c8323662689675", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-317c6d53e8c225d9", "level": "note", "message": {"text": "Very large file: apps/web/components/Generator.tsx (1755 lines)"}, "properties": {"repobilityId": "7f15ba0aca5121a2", "scanner": "scanner-primary", "fingerprint": "317c6d53e8c225d9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7f6fde0e2f26f86f", "level": "note", "message": {"text": "Very large file: apps/web/app/m/[id]/view.tsx (1712 lines)"}, "properties": {"repobilityId": "abb39fb882aa8b3a", "scanner": "scanner-primary", "fingerprint": "7f6fde0e2f26f86f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "d27a0881718cd2bf", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "d50f207f35dd2e8f", "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": "f36faabf788a65c2", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "f7dd8ea3c32da5c2", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "fd1a4ee11633d2ca", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "db0dddbd051b1808", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "943050bd2b58e6a9", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "8fc0d6144cfd4af8", "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": "4b407ba9b9947899", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9e244936c6b700c4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/start-app.md"}, "properties": {"repobilityId": "5700b1c8d401193d", "scanner": "scanner-primary", "fingerprint": "9e244936c6b700c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/start-app.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-47506e394b46668c", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ops-db/SKILL.md"}, "properties": {"repobilityId": "010d5ec01f277507", "scanner": "scanner-primary", "fingerprint": "47506e394b46668c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ops-db/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e631b7231f470af7", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ops-errors/SKILL.md"}, "properties": {"repobilityId": "75e669bcd6a3bf16", "scanner": "scanner-primary", "fingerprint": "e631b7231f470af7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ops-errors/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f3279dfaea764e1", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/start-app/SKILL.md"}, "properties": {"repobilityId": "8a60be3dcf75b7d3", "scanner": "scanner-primary", "fingerprint": "0f3279dfaea764e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/start-app/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cfcc0df56d711180", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ops-payment/SKILL.md"}, "properties": {"repobilityId": "1da2706383abb450", "scanner": "scanner-primary", "fingerprint": "cfcc0df56d711180", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ops-payment/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1183d94efe4833d4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ops-client/SKILL.md"}, "properties": {"repobilityId": "57d107b657ab55ef", "scanner": "scanner-primary", "fingerprint": "1183d94efe4833d4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ops-client/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-608471c8f94a1e69", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/database/database.module.ts:36"}, "properties": {"repobilityId": "2106e3d589c27175", "scanner": "scanner-primary", "fingerprint": "608471c8f94a1e69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30be754f031a5e36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/mailer/providers/mailgun.provider.ts:55"}, "properties": {"repobilityId": "f196ae101bc53ea0", "scanner": "scanner-primary", "fingerprint": "30be754f031a5e36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ec8d544dd47edf3", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/modules/settings/settings-schema.ts:206"}, "properties": {"repobilityId": "2f134e040e33ab2a", "scanner": "scanner-primary", "fingerprint": "2ec8d544dd47edf3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27bde48033b2e412", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/modules/suno/providers/suno.real.provider.ts:667"}, "properties": {"repobilityId": "51431112e46a7b85", "scanner": "scanner-primary", "fingerprint": "27bde48033b2e412", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f359eaadc87732d3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/suno/providers/suno.real.provider.ts:193"}, "properties": {"repobilityId": "9e3a75ec7da65b57", "scanner": "scanner-primary", "fingerprint": "f359eaadc87732d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bdb9ec17706c48b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/modules/analytics/ad-spend.service.ts:321"}, "properties": {"repobilityId": "83c575cdfe97cee2", "scanner": "scanner-primary", "fingerprint": "bdb9ec17706c48b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05dad596e9b63f4f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/analytics/ad-spend.service.ts:151"}, "properties": {"repobilityId": "b7ef9c51e4fe2a17", "scanner": "scanner-primary", "fingerprint": "05dad596e9b63f4f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6cc7c66923819830", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/modules/analytics/forwarders.ts:230"}, "properties": {"repobilityId": "d3a2b4be9081ec21", "scanner": "scanner-primary", "fingerprint": "6cc7c66923819830", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c8e564408a97313", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/suggestions/suggestions.service.ts:100"}, "properties": {"repobilityId": "bb90b517a7a0f081", "scanner": "scanner-primary", "fingerprint": "7c8e564408a97313", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96b9275bd10da848", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/modules/generations/generations.processor.ts:208"}, "properties": {"repobilityId": "718c89950587ba84", "scanner": "scanner-primary", "fingerprint": "96b9275bd10da848", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec6159bdc023d2d4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/generations/audio-processor.service.ts:96"}, "properties": {"repobilityId": "386e14fad36237aa", "scanner": "scanner-primary", "fingerprint": "ec6159bdc023d2d4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-69f82aaef51dd121", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/modules/chat/chat.gateway.ts:257"}, "properties": {"repobilityId": "613df093900f68ea", "scanner": "scanner-primary", "fingerprint": "69f82aaef51dd121", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bba2e8633fcfd72", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/modules/chat/chat.service.ts:378"}, "properties": {"repobilityId": "146526e2760d6cd1", "scanner": "scanner-primary", "fingerprint": "3bba2e8633fcfd72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16425c27371076a6", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/modules/meta-capi/meta-capi.controller.ts:96"}, "properties": {"repobilityId": "adac0598de2a9cc6", "scanner": "scanner-primary", "fingerprint": "16425c27371076a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fdf6ad2eafbf7ce7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/meta-capi/meta-capi.service.ts:124"}, "properties": {"repobilityId": "62aaaddabfd13272", "scanner": "scanner-primary", "fingerprint": "fdf6ad2eafbf7ce7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-86fb420075bc88a9", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/modules/lyrics/lyrics.module.ts:717"}, "properties": {"repobilityId": "3bb359a9b984199e", "scanner": "scanner-primary", "fingerprint": "86fb420075bc88a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-413b960252c08bb5", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/modules/admin/admin-orders.controller.ts:131"}, "properties": {"repobilityId": "51f7f53335ac9ac5", "scanner": "scanner-primary", "fingerprint": "413b960252c08bb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6fd277a8cbe1774", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/modules/admin/admin.controller.ts:262"}, "properties": {"repobilityId": "bdcaa7a00bfa843e", "scanner": "scanner-primary", "fingerprint": "c6fd277a8cbe1774", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-795cd14f12596dc6", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/modules/ai-chat/ai-chat-agent.service.ts:239"}, "properties": {"repobilityId": "6a2d0ec89757da2b", "scanner": "scanner-primary", "fingerprint": "795cd14f12596dc6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bcc1fe0bd0bd2890", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/modules/payments/payments.controller.ts:95"}, "properties": {"repobilityId": "9594a4ab64cd7db7", "scanner": "scanner-primary", "fingerprint": "bcc1fe0bd0bd2890", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-457d57db911da395", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/modules/payments/payments.service.ts:70"}, "properties": {"repobilityId": "9a92e16345cf55e9", "scanner": "scanner-primary", "fingerprint": "457d57db911da395", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab53fd029e4b2d15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/seo-pages/seo-page-generator.service.ts:155"}, "properties": {"repobilityId": "b4013e96a1be0584", "scanner": "scanner-primary", "fingerprint": "ab53fd029e4b2d15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6fc8106268f47464", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/modules/sites/sites.service.ts:92"}, "properties": {"repobilityId": "9a06c4c5dafdf824", "scanner": "scanner-primary", "fingerprint": "6fc8106268f47464", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8fd9568461b9d72", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/modules/sites/sites.controller.ts:217"}, "properties": {"repobilityId": "b5bff0bceab4d60e", "scanner": "scanner-primary", "fingerprint": "d8fd9568461b9d72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2a60349b09c9099", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/modules/sites/site-samples.service.ts:155"}, "properties": {"repobilityId": "6f00e6b2c784757e", "scanner": "scanner-primary", "fingerprint": "b2a60349b09c9099", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c3e741eb9a2ef76", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/sites/site-samples.service.ts:539"}, "properties": {"repobilityId": "901e278f592100cc", "scanner": "scanner-primary", "fingerprint": "1c3e741eb9a2ef76", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d3383f60564c7522", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/app/(dashboard)/chat/_content.tsx:623"}, "properties": {"repobilityId": "2636285c698edc85", "scanner": "scanner-primary", "fingerprint": "d3383f60564c7522", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c346ed7150d5765", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/app/(dashboard)/site/_content.tsx:1584"}, "properties": {"repobilityId": "224d1894a0637fbf", "scanner": "scanner-primary", "fingerprint": "3c346ed7150d5765", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e9b9744eeb4781e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/lib/seed-categories.ts:7"}, "properties": {"repobilityId": "4d2fc2fa4af9b12d", "scanner": "scanner-primary", "fingerprint": "2e9b9744eeb4781e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb3ea350e3635493", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/lib/api/database.api.ts:40"}, "properties": {"repobilityId": "073db8124d2ebbb2", "scanner": "scanner-primary", "fingerprint": "bb3ea350e3635493", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-016c49ac0ec5abab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/lib/api/mail.api.ts:88"}, "properties": {"repobilityId": "bd3519a349016ab5", "scanner": "scanner-primary", "fingerprint": "016c49ac0ec5abab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1722ebe495abc65c", "level": "none", "message": {"text": "Commented-code block (13 lines) in apps/admin/lib/http/client.ts:97"}, "properties": {"repobilityId": "238ecda954f3b3c6", "scanner": "scanner-primary", "fingerprint": "1722ebe495abc65c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc95e4e5f095ce64", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/sections.tsx:126"}, "properties": {"repobilityId": "f4ce9ad1cfec441b", "scanner": "scanner-primary", "fingerprint": "fc95e4e5f095ce64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-430063e907729fe0", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/Generator.tsx:277"}, "properties": {"repobilityId": "61a34bdf41273dcd", "scanner": "scanner-primary", "fingerprint": "430063e907729fe0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ccaadf0a049c7b39", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/ChatWidget.tsx:339"}, "properties": {"repobilityId": "828615dcd888c843", "scanner": "scanner-primary", "fingerprint": "ccaadf0a049c7b39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6aaa27d14564c442", "level": "none", "message": {"text": "Commented-code block (16 lines) in apps/web/components/OpenReplay.tsx:59"}, "properties": {"repobilityId": "441985d078352606", "scanner": "scanner-primary", "fingerprint": "6aaa27d14564c442", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a8ea77bbeed8b0b3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/DemosPopup.tsx:189"}, "properties": {"repobilityId": "cd52025c5d09c47c", "scanner": "scanner-primary", "fingerprint": "a8ea77bbeed8b0b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63647cf56338d796", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/app/layout.tsx:147"}, "properties": {"repobilityId": "7c8115357c2a927c", "scanner": "scanner-primary", "fingerprint": "63647cf56338d796", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86f0e1d864529e50", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/app/istoric/page.tsx:53"}, "properties": {"repobilityId": "2089c0e6a677d628", "scanner": "scanner-primary", "fingerprint": "86f0e1d864529e50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-721743b6517e28e2", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/lib/tracking.ts:182"}, "properties": {"repobilityId": "a683176b3d71fc0f", "scanner": "scanner-primary", "fingerprint": "721743b6517e28e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47d48e0da5e8c29f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/site-config.ts:47"}, "properties": {"repobilityId": "8da9481db92afbe2", "scanner": "scanner-primary", "fingerprint": "47d48e0da5e8c29f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6a97764c1d19027b", "level": "note", "message": {"text": "Legacy-named symbol `mc_consent_v1` in apps/web/lib/tracker.ts:7"}, "properties": {"repobilityId": "1ba60e0c80ac5d7d", "scanner": "scanner-primary", "fingerprint": "6a97764c1d19027b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7eaa81644a6d0372", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/lib/tracker.ts:353"}, "properties": {"repobilityId": "d1db67086132df92", "scanner": "scanner-primary", "fingerprint": "7eaa81644a6d0372", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a82cf7d16234d20", "level": "note", "message": {"text": "21 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "2fad2cbef136ee78", "scanner": "scanner-primary", "fingerprint": "9a82cf7d16234d20", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-b2e27245b75416db", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/modules/suggestions/suggestions.service.ts:100)"}, "properties": {"repobilityId": "36eb8f6a246ad8b6", "scanner": "scanner-primary", "fingerprint": "b2e27245b75416db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df68e9f8de5b71bc", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/modules/lyrics/lyrics.module.ts:730)"}, "properties": {"repobilityId": "3a3b3a3bd1d92fe6", "scanner": "scanner-primary", "fingerprint": "df68e9f8de5b71bc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d394b18b3ac44aac", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/api/src/modules/seo-pages/seo-page-generator.service.ts:155)"}, "properties": {"repobilityId": "26875a69ef427d77", "scanner": "scanner-primary", "fingerprint": "d394b18b3ac44aac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4cf9d68d869db74e", "level": "error", "message": {"text": "Dangling fetch: POST /ops-chat/terminal-input (apps/admin/app/(dashboard)/terminal/_content.tsx:167)"}, "properties": {"repobilityId": "131e2e0f486c8899", "scanner": "scanner-primary", "fingerprint": "4cf9d68d869db74e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-049c61430bf743f5", "level": "error", "message": {"text": "Dangling fetch: POST /ops-chat/chat (apps/admin/app/(dashboard)/terminal/_content.tsx:324)"}, "properties": {"repobilityId": "024a9cca127d7b92", "scanner": "scanner-primary", "fingerprint": "049c61430bf743f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e7673fe05fdaad2", "level": "error", "message": {"text": "Dangling fetch: POST /guest-sessions (apps/web/lib/api.ts:113)"}, "properties": {"repobilityId": "1d7d62bd4e2215df", "scanner": "scanner-primary", "fingerprint": "2e7673fe05fdaad2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-45d5ae7441954b95", "level": "error", "message": {"text": "Dangling fetch: POST /generations (apps/web/lib/api.ts:348)"}, "properties": {"repobilityId": "22fd5c07242a3efb", "scanner": "scanner-primary", "fingerprint": "45d5ae7441954b95", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-95f0a5d8489cc10c", "level": "error", "message": {"text": "Dangling fetch: GET /generations/${id} (apps/web/lib/api.ts:353)"}, "properties": {"repobilityId": "e7120f41eb9c11c0", "scanner": "scanner-primary", "fingerprint": "95f0a5d8489cc10c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-791be45c2616ec45", "level": "error", "message": {"text": "Dangling fetch: GET /public/site-demos (apps/web/lib/api.ts:382)"}, "properties": {"repobilityId": "8b0f693f53038376", "scanner": "scanner-primary", "fingerprint": "791be45c2616ec45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-2cad743ac7e67431", "level": "error", "message": {"text": "Dangling fetch: POST /generations/${id}/retry (apps/web/lib/api.ts:409)"}, "properties": {"repobilityId": "06a19d2266342b03", "scanner": "scanner-primary", "fingerprint": "2cad743ac7e67431", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4b1988b04ac2a955", "level": "error", "message": {"text": "Dangling fetch: POST /generations/${id}/unlock (apps/web/lib/api.ts:411)"}, "properties": {"repobilityId": "50805589e827750a", "scanner": "scanner-primary", "fingerprint": "4b1988b04ac2a955", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-40668609391454e8", "level": "error", "message": {"text": "Dangling fetch: POST /generations/${id}/unlock-with-gift (apps/web/lib/api.ts:416)"}, "properties": {"repobilityId": "ecfa21fd76421b2b", "scanner": "scanner-primary", "fingerprint": "40668609391454e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8c9c1d721dab8050", "level": "error", "message": {"text": "Dangling fetch: POST /generations/${generationId}/unlock-check (apps/web/lib/api.ts:607)"}, "properties": {"repobilityId": "c8103553256dda48", "scanner": "scanner-primary", "fingerprint": "8c9c1d721dab8050", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6051edba0518d0aa", "level": "note", "message": {"text": "Unused endpoint: GET /admin/mail/accounts"}, "properties": {"repobilityId": "e07d17de95d7940d", "scanner": "scanner-primary", "fingerprint": "6051edba0518d0aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d0794e0f95c47d8", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/accounts"}, "properties": {"repobilityId": "6c3a74146eea6336", "scanner": "scanner-primary", "fingerprint": "8d0794e0f95c47d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b5bb8cc7673218a6", "level": "note", "message": {"text": "Unused endpoint: PATCH /admin/mail/accounts/:id"}, "properties": {"repobilityId": "eecd072da9d266e4", "scanner": "scanner-primary", "fingerprint": "b5bb8cc7673218a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f4bbaa707b04394", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/mail/accounts/:id"}, "properties": {"repobilityId": "e073eeb97956ff39", "scanner": "scanner-primary", "fingerprint": "7f4bbaa707b04394", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-809b5bec7087a8c2", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/accounts/test"}, "properties": {"repobilityId": "e592ef8eadc57273", "scanner": "scanner-primary", "fingerprint": "809b5bec7087a8c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f0822e8e21934495", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/accounts/:id/test"}, "properties": {"repobilityId": "4b93f1af153e058a", "scanner": "scanner-primary", "fingerprint": "f0822e8e21934495", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72a899c2e2f0c16f", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/accounts/:id/sync"}, "properties": {"repobilityId": "759045b9461fc888", "scanner": "scanner-primary", "fingerprint": "72a899c2e2f0c16f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-250f612875eb2d40", "level": "note", "message": {"text": "Unused endpoint: GET /admin/mail/accounts/:id/folders"}, "properties": {"repobilityId": "55cd2ef5ac72b201", "scanner": "scanner-primary", "fingerprint": "250f612875eb2d40", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9fc5415bd1f9142b", "level": "note", "message": {"text": "Unused endpoint: GET /admin/mail/messages"}, "properties": {"repobilityId": "2cc09de8303cf0c7", "scanner": "scanner-primary", "fingerprint": "9fc5415bd1f9142b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-817247e2c1e05065", "level": "note", "message": {"text": "Unused endpoint: GET /admin/mail/threads/:threadId"}, "properties": {"repobilityId": "5177a2f80cb0075b", "scanner": "scanner-primary", "fingerprint": "817247e2c1e05065", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7360273f36e99b73", "level": "note", "message": {"text": "Unused endpoint: GET /admin/mail/messages/:id"}, "properties": {"repobilityId": "d846b07ffb7a613e", "scanner": "scanner-primary", "fingerprint": "7360273f36e99b73", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f08641ed235f92f", "level": "note", "message": {"text": "Unused endpoint: PATCH /admin/mail/messages/:id"}, "properties": {"repobilityId": "1e89270eb08af872", "scanner": "scanner-primary", "fingerprint": "6f08641ed235f92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-62295d22a59c7199", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/messages/:id/reply"}, "properties": {"repobilityId": "384cb950306692de", "scanner": "scanner-primary", "fingerprint": "62295d22a59c7199", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f9148f21e788bf5f", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/translate-out"}, "properties": {"repobilityId": "1e3021e7248ccb30", "scanner": "scanner-primary", "fingerprint": "f9148f21e788bf5f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-598dcf962e76dc3d", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/messages/:id/translate"}, "properties": {"repobilityId": "9f4e44e3e8f152be", "scanner": "scanner-primary", "fingerprint": "598dcf962e76dc3d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5dc8fe1a42ee0658", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/messages/:id/archive"}, "properties": {"repobilityId": "60b57f729e33247d", "scanner": "scanner-primary", "fingerprint": "5dc8fe1a42ee0658", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb6361edd6da22fb", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/messages/:id/unarchive"}, "properties": {"repobilityId": "c69f444c760ee1fc", "scanner": "scanner-primary", "fingerprint": "bb6361edd6da22fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d595771bb2c275b", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/mail/messages/:id"}, "properties": {"repobilityId": "4282a1377910b3b9", "scanner": "scanner-primary", "fingerprint": "6d595771bb2c275b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2cba3a218e30daa", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/suggestions/:id/send"}, "properties": {"repobilityId": "447fd617f59b1f67", "scanner": "scanner-primary", "fingerprint": "e2cba3a218e30daa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6520818f3f65708b", "level": "note", "message": {"text": "Unused endpoint: POST /admin/mail/suggestions/:id/dismiss"}, "properties": {"repobilityId": "2e3c8c0746a6276c", "scanner": "scanner-primary", "fingerprint": "6520818f3f65708b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c03841f7a960ea8", "level": "note", "message": {"text": "Unused endpoint: GET /admin/mail/attachments/:id"}, "properties": {"repobilityId": "a5a82af9037e994d", "scanner": "scanner-primary", "fingerprint": "9c03841f7a960ea8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-963928480b15bc5b", "level": "note", "message": {"text": "Unused endpoint: GET /admin/mail/unread-total"}, "properties": {"repobilityId": "f949517cac3f16fa", "scanner": "scanner-primary", "fingerprint": "963928480b15bc5b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a36563c82782990", "level": "note", "message": {"text": "Unused endpoint: POST /suno/callback"}, "properties": {"repobilityId": "dcd812a8ccd92c03", "scanner": "scanner-primary", "fingerprint": "0a36563c82782990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1f3db66ddc50202", "level": "note", "message": {"text": "Unused endpoint: GET /auth/magic-link/consume"}, "properties": {"repobilityId": "0e740d2abca00f4f", "scanner": "scanner-primary", "fingerprint": "e1f3db66ddc50202", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8817b45a1d80ef52", "level": "note", "message": {"text": "Unused endpoint: POST /auth/locale"}, "properties": {"repobilityId": "68c2bd1762fc1ecb", "scanner": "scanner-primary", "fingerprint": "8817b45a1d80ef52", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-927752f4a0639817", "level": "note", "message": {"text": "Unused endpoint: POST /admin/ai-assistant/chat"}, "properties": {"repobilityId": "00043cb19f5387f8", "scanner": "scanner-primary", "fingerprint": "927752f4a0639817", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f23ed081f1885e39", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/whoami"}, "properties": {"repobilityId": "eacebc96658b164c", "scanner": "scanner-primary", "fingerprint": "f23ed081f1885e39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a29959244c7dcf2", "level": "note", "message": {"text": "Unused endpoint: POST /analytics/track"}, "properties": {"repobilityId": "9278d5691dc71eca", "scanner": "scanner-primary", "fingerprint": "3a29959244c7dcf2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3bc815fb099eeeb6", "level": "note", "message": {"text": "Unused endpoint: POST /analytics/track/batch"}, "properties": {"repobilityId": "3db2619342c1b2ac", "scanner": "scanner-primary", "fingerprint": "3bc815fb099eeeb6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2be4f15c89170885", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/ad-spend"}, "properties": {"repobilityId": "dcc5b60353319448", "scanner": "scanner-primary", "fingerprint": "2be4f15c89170885", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-93095092fa4a884b", "level": "note", "message": {"text": "Unused endpoint: POST /analytics/ad-spend/sync"}, "properties": {"repobilityId": "8d2b53f185ba09d3", "scanner": "scanner-primary", "fingerprint": "93095092fa4a884b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b22b0ddda467f51e", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/overview"}, "properties": {"repobilityId": "89919831c2bebb7c", "scanner": "scanner-primary", "fingerprint": "b22b0ddda467f51e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-038735f584664215", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/time-series"}, "properties": {"repobilityId": "c108cdca740f26af", "scanner": "scanner-primary", "fingerprint": "038735f584664215", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-101b3ca4043d83d7", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/funnel"}, "properties": {"repobilityId": "cb3ba2a3bc508dc7", "scanner": "scanner-primary", "fingerprint": "101b3ca4043d83d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fe0661a06e488048", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/sources"}, "properties": {"repobilityId": "3c848030e004d36e", "scanner": "scanner-primary", "fingerprint": "fe0661a06e488048", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9c5235c51d834fe", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/revenue-by-source"}, "properties": {"repobilityId": "39dd1ab4afc1a0bb", "scanner": "scanner-primary", "fingerprint": "d9c5235c51d834fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aac35ba6957d3cfd", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/revenue-by-campaign"}, "properties": {"repobilityId": "694bdbdc541e294b", "scanner": "scanner-primary", "fingerprint": "aac35ba6957d3cfd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b37aceadd8d8fc74", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/top-pages"}, "properties": {"repobilityId": "79049085dc9ee1a6", "scanner": "scanner-primary", "fingerprint": "b37aceadd8d8fc74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-df4eb5c1d5180ddd", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/devices"}, "properties": {"repobilityId": "6032d0c2a428cc48", "scanner": "scanner-primary", "fingerprint": "df4eb5c1d5180ddd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-016b3f749d6a1113", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/users"}, "properties": {"repobilityId": "3236134389c16d29", "scanner": "scanner-primary", "fingerprint": "016b3f749d6a1113", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-95795f50e8f6bda6", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/stripe-reconciliation"}, "properties": {"repobilityId": "46d31d66912bd942", "scanner": "scanner-primary", "fingerprint": "95795f50e8f6bda6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ad3ffccc2707aa1", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/pixel-cross-check"}, "properties": {"repobilityId": "a495bf2e973757b0", "scanner": "scanner-primary", "fingerprint": "7ad3ffccc2707aa1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-abe85303bd7aa7c8", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/countries"}, "properties": {"repobilityId": "5b09cdff2d9c0b56", "scanner": "scanner-primary", "fingerprint": "abe85303bd7aa7c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f16243d2571b60b0", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/browsers"}, "properties": {"repobilityId": "193fe4c3762c205e", "scanner": "scanner-primary", "fingerprint": "f16243d2571b60b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ca033fd7ff77cbc", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/os"}, "properties": {"repobilityId": "f488bcb44a6d4abd", "scanner": "scanner-primary", "fingerprint": "6ca033fd7ff77cbc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ae7da59005743fc", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/screens"}, "properties": {"repobilityId": "a2ca1f66970829a6", "scanner": "scanner-primary", "fingerprint": "1ae7da59005743fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0bd5ecc3c79eede3", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/languages"}, "properties": {"repobilityId": "c7e4fd291b35d56c", "scanner": "scanner-primary", "fingerprint": "0bd5ecc3c79eede3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad509ff5130504c5", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/web-vitals"}, "properties": {"repobilityId": "2ffd54855688ad94", "scanner": "scanner-primary", "fingerprint": "ad509ff5130504c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bbfe55b6c1473e09", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/sessions"}, "properties": {"repobilityId": "c5687f8a703410bb", "scanner": "scanner-primary", "fingerprint": "bbfe55b6c1473e09", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8969085a41f87f63", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/bots"}, "properties": {"repobilityId": "0d210fa4108406e5", "scanner": "scanner-primary", "fingerprint": "8969085a41f87f63", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}