{"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-672081fb9c11b186", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/migrate-user-keys-to-system.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/migrate-user-keys-to-system.ts:91"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac4bd719447f0070", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/handlers/oauth.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/handlers/oauth.ts:9"}, "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-8bd6addcda694a74", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ArticleEditor.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ArticleEditor.tsx:191"}, "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-1bb8116dad655b4b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/components/ArticleEditor.tsx:273", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/components/ArticleEditor.tsx:273"}, "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-eaa07297da112b92", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ImageLibraryPicker.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ImageLibraryPicker.tsx:82"}, "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-0f1a3bb9927bc97f", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/settings/route.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/settings/route.ts:100"}, "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-ed645777b8098c71", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/posts/route.ts:251", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/posts/route.ts:251"}, "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-18a08710746c1e21", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/posts/[id]/sync-analytics/route.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/posts/[id]/sync-analytics/route.ts:64"}, "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-046777fded617770", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/templates/route.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/templates/route.ts:8"}, "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-145c6f8274d8b082", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/[platform]/route.ts:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/[platform]/route.ts:144"}, "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-49247073709802a4", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/[platform]/callback/route.ts:132", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/[platform]/callback/route.ts:132"}, "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-dbf0eb12a4f1bcfc", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/[platform]/pages/route.ts:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/[platform]/pages/route.ts:117"}, "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-ce98804feda6906c", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/instagram/refresh-username/route.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/instagram/refresh-username/route.ts:12"}, "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-fc6a3c05fc306c76", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/settings/wordpress/page.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/settings/wordpress/page.tsx:145"}, "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-980c40b3cc84e2e8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/topics/csv/page.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/topics/csv/page.tsx:166"}, "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-7ebccab38f7bda70", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/workflow/page.tsx:267", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/workflow/page.tsx:267"}, "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-25a93f49787cbb59", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/images/page.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/images/page.tsx:239"}, "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-81ef8d0b2f014d53", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/page.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/page.tsx:96"}, "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-4b36eb54b8dc0005", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/social/[runId]/page.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/social/[runId]/page.tsx:225"}, "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-c42c2d9a82f915fe", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/prompts/[stepNumber]/PromptEditor.tsx:644", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/prompts/[stepNumber]/PromptEditor.tsx:644"}, "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-79756b821cff0277", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/articles/page.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/articles/page.tsx:114"}, "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-c7e7e538e47e71ed", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/articles/[jobId]/page.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/articles/[jobId]/page.tsx:82"}, "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-8d06750c0948050d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/music/page.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/music/page.tsx:173"}, "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-ee38188d38cd58cc", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/lib/sanitize-html.ts:4", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/lib/sanitize-html.ts:4"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8842e0aa24e411df", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/settings/useSocialConnections.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/settings/useSocialConnections.ts:49"}, "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-d1d46a8c5bed98d8", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/settings/PlatformConnectionRow.tsx:315", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/settings/PlatformConnectionRow.tsx:315"}, "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-eb92da821f7327f4", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/threads.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/threads.ts:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-571e439ee1aa4208", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/facebook.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/facebook.ts:38"}, "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-f543c5784e0159cb", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/linkedin.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/linkedin.ts:67"}, "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-03c1f696f1c1eed1", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/instagram.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/instagram.ts:41"}, "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-20c6e086f7d086bc", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/dashboard/useDashboard.ts:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/dashboard/useDashboard.ts:119"}, "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-de57bae9a3b27a9e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/FinalReviewPanel.tsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/FinalReviewPanel.tsx:42"}, "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-27c74ce0c749df84", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/ExportPanel.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/ExportPanel.tsx:107"}, "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-ecf5a842c399cd49", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/SchemaPanel.tsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/SchemaPanel.tsx:37"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-878d6ccfd243b6ca", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/ReviewContentPanel.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/ReviewContentPanel.tsx:46"}, "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-f14359617436e5ea", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/idea-capture/useIdeaCapture.ts:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/idea-capture/useIdeaCapture.ts:96"}, "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-ba4874a9177b21ee", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/posts-list/usePostsList.ts:441", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/posts-list/usePostsList.ts:441"}, "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-69f8ac90a781caf7", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-images.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-images.ts:65"}, "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-36555d0b9e9b612b", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-encryption.ts:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-encryption.ts:107"}, "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-45b51364306be57b", "name": "TODO/FIXME marker in shipping code \u2014 packages/shared/src/storage.ts:123", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/shared/src/storage.ts:123"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11ca9905b9ca60d9", "name": "TODO/FIXME marker in shipping code \u2014 packages/shared/src/linkedinApi.ts:295", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/shared/src/linkedinApi.ts:295"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aae01b2b3dc8cc3a", "name": "Stray `console.log` in TS/JS \u2014 packages/shared/src/linkedinApi.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/linkedinApi.ts:64"}, "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-28f60f31d6aa0f2e", "name": "Stray `console.log` in TS/JS \u2014 packages/shared/src/encryption.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/encryption.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65d37d3f04d522db", "name": "Stray `console.log` in TS/JS \u2014 packages/shared/src/telegramApi.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/telegramApi.ts:66"}, "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-c5cc416fa82f8440", "name": "Stray `console.log` in TS/JS \u2014 packages/shared/src/imageGeneration.ts:228", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/imageGeneration.ts:228"}, "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-6105ced4af0a6778", "name": "Stray `console.log` in TS/JS \u2014 packages/shared/src/twitterApi.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/twitterApi.ts:99"}, "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-27d97f80016641c6", "name": "Stray `console.log` in TS/JS \u2014 packages/shared/src/threadsApi.ts:106", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/threadsApi.ts:106"}, "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-7bf4553113544431", "name": "Stray `console.log` in TS/JS \u2014 packages/shared/src/instagramUsername.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/instagramUsername.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37a41d24f18ae776", "name": "Stray `console.log` in TS/JS \u2014 packages/db/scripts/backfill-media-library.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/db/scripts/backfill-media-library.ts:51"}, "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-48247518f3aa5d02", "name": "Stray `console.log` in TS/JS \u2014 packages/db/scripts/seed-max-tokens.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/db/scripts/seed-max-tokens.ts:52"}, "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-67c9ae4f1b78286f", "name": "Stray `console.log` in TS/JS \u2014 packages/db/scripts/reseed-prompts-v3.ts:1411", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/db/scripts/reseed-prompts-v3.ts:1411"}, "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-2f75e99de95f2d34", "name": "Stray `console.log` in TS/JS \u2014 packages/db/prisma/seed.ts:1620", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/db/prisma/seed.ts:1620"}, "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-dbdf710d06955274", "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-5f90eed87916b5d7", "name": "Privileged port 20 in use", "shortDescription": {"text": "Privileged port 20 in use"}, "fullDescription": {"text": "Port 20 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-3d70dcd36b57a39a", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-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-ce11df9608afa5ac", "name": "Insecure pattern 'node_child_process' in apps/api/src/article-pipeline/enrichment/svg-renderer.ts:9", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/api/src/article-pipeline/enrichment/svg-renderer.ts:9"}, "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-b060d0949d934c9a", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/api/src/routes/admin.ts:83", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/api/src/routes/admin.ts:83"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bef8944151cda2a5", "name": "Insecure pattern 'node_child_process' in apps/api/src/social/video/ffmpeg.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/api/src/social/video/ffmpeg.ts:1"}, "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-5d4611641d8273ff", "name": "Insecure pattern 'node_child_process' in apps/api/src/handlers/backup.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/api/src/handlers/backup.ts:2"}, "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-a85e06d996fcebb4", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/components/ArticleEditor.tsx:273", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/components/ArticleEditor.tsx:273"}, "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-8ee20e61ce5b930f", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/ArticleEditor.tsx:55", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/ArticleEditor.tsx:55"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cbe33c309bbc13fb", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/lib/article-html-islands.ts:42", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/lib/article-html-islands.ts:42"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b47deddfe196fb70", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "docker/login-action@v3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2352406d1940b9e0", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "pnpm/action-setup@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-798cb43a4e14641c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "tailscale/github-action@v3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3cd14d6f45a87d58", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "docker/login-action@v3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4bf411a1bee458fb", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a60cfa00ffdc5590", "name": "Very large file: packages/db/scripts/reseed-prompts-v3.ts (1479 lines)", "shortDescription": {"text": "Very large file: packages/db/scripts/reseed-prompts-v3.ts (1479 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-f1c86e801e0b0ea3", "name": "Very large file: packages/db/prisma/seed.ts (1718 lines)", "shortDescription": {"text": "Very large file: packages/db/prisma/seed.ts (1718 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "50 tests / 407 src (ratio 0.12)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2699d5f16ae11282", "name": "Node manifest has dependencies but no lockfile: packages/shared/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b16ae2bd0fca524", "name": "Node manifest has dependencies but no lockfile: packages/db/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/db/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 238 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 143 placeholder/mock markers across 31 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-c5edc2537ef0db30", "name": "Commented-code block (5 lines) in apps/api/src/article-pipeline/approval-service.ts:335", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/article-pipeline/approval-service.ts:335"}, "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-10e524d2b418b6fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/image-uploader.ts:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/image-uploader.ts:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-077651d3d6340fcf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/citation-validator.ts:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/citation-validator.ts:129"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-170df7c6170f62b9", "name": "Commented-code block (6 lines) in apps/api/src/article-pipeline/step-runner.ts:196", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/article-pipeline/step-runner.ts:196"}, "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-06429025f2d6d237", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/__tests__/citation-validator.test.ts:87", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/__tests__/citation-validator.test.ts:87"}, "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-e9b2517a6de9d409", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/enrichment/wp-category-selector.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/enrichment/wp-category-selector.ts:29"}, "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-794e990873b3ffde", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/enrichment/wp-tag-selector.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/enrichment/wp-tag-selector.ts:30"}, "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-0864a8db2cdcf92c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/output/bundle-target.ts:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/output/bundle-target.ts:84"}, "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-9c6dafc71213a077", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/output/wordpress-target.ts:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/output/wordpress-target.ts:78"}, "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-6511a6974b1130f2", "name": "Legacy-named symbol `eleven_multilingual_v2` in apps/api/src/lib/elevenlabs/client.ts:99", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in apps/api/src/lib/elevenlabs/client.ts:99"}, "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-0a01f8b915abf9f3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/elevenlabs/client.ts:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/elevenlabs/client.ts:90"}, "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-b83fe8221f7206b8", "name": "Legacy-named symbol `eleven_multilingual_v2` in apps/api/src/lib/elevenlabs/settings.ts:29", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in apps/api/src/lib/elevenlabs/settings.ts:29"}, "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-86da4c39636597d5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/ai.ts:190", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/ai.ts:190"}, "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-9d2726c61138b2e3", "name": "Commented-code block (5 lines) in apps/api/src/routes/media.ts:23", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/media.ts:23"}, "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-173948dc477593d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/wp-connections.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/wp-connections.ts:32"}, "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-3a93ce2317e451f5", "name": "Commented-code block (5 lines) in apps/api/src/routes/articles.ts:70", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/articles.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-bee4496b437864a2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/admin.ts:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/admin.ts:76"}, "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-a9c3fe2345aba8ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/social/generate-video-assets.ts:534", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/social/generate-video-assets.ts:534"}, "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-09ebc6f5cf5552a8", "name": "Commented-code block (6 lines) in apps/api/src/social/compositors/carousel.ts:76", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/social/compositors/carousel.ts:76"}, "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-f822628c69b6d899", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/social/compositors/carousel.ts:216", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/social/compositors/carousel.ts:216"}, "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-829bf752a0cccb5a", "name": "Commented-code block (5 lines) in apps/api/src/queues/index.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/queues/index.ts:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-80e39492f54894b7", "name": "Commented-code block (5 lines) in apps/web/src/middleware.ts:63", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/middleware.ts:63"}, "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-d980e049c82bfbbe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/ai/models/[provider]/route.ts:212", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/ai/models/[provider]/route.ts:212"}, "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-391b125397d2cb4e", "name": "Commented-code block (6 lines) in apps/web/src/app/api/social/[platform]/route.ts:45", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/app/api/social/[platform]/route.ts:45"}, "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-aef48d13c354f6a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/social/[platform]/pages/route.ts:162", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/social/[platform]/pages/route.ts:162"}, "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-3942c3af62b2b83a", "name": "Commented-code block (5 lines) in apps/web/src/app/api/articles/[jobId]/events/route.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/app/api/articles/[jobId]/events/route.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b26183e32adaad1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/articles/[jobId]/events/route.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/articles/[jobId]/events/route.ts:31"}, "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-c84395b9594bb70e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/settings/wordpress/page.tsx:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/settings/wordpress/page.tsx:61"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5bf11f2c31af06b4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/templates/page.tsx:202", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/templates/page.tsx:202"}, "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-371c56b865cb9ad2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/workflow/[jobId]/preview/page.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/workflow/[jobId]/preview/page.tsx:22"}, "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-26388d2960cb6d16", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/account/page.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/account/page.tsx:22"}, "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-890f4b5adfd98118", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/images/page.tsx:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/images/page.tsx:94"}, "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-4bb7a052cb40a6be", "name": "Commented-code block (7 lines) in apps/web/src/lib/api-proxy.ts:28", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/lib/api-proxy.ts:28"}, "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-91a952ad5aa91e16", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/use-authed-fetch.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/use-authed-fetch.ts:44"}, "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-3ae92b250d8574c4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/mockAI.ts:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/mockAI.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-8f6e462280315e8d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/settings/PlatformConnectionRow.tsx:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/settings/PlatformConnectionRow.tsx:61"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a827769cc7f4f36a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/threads.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/threads.ts:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8e9709f7cb67ce8f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/facebook.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/facebook.ts:45"}, "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-3250cf23af923ebc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/linkedin.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/linkedin.ts:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-02cfd9b9cdad5ce4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/twitter.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/twitter.ts:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aed5aa2f5fd6511e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/instagram.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/instagram.ts:48"}, "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-a8903b170bac1c9e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/dashboard/useDashboard.ts:144", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/dashboard/useDashboard.ts:144"}, "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-cb4635e6380f8c16", "name": "Commented-code block (6 lines) in apps/web/src/features/workflow/useWorkflowJob.ts:203", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/features/workflow/useWorkflowJob.ts:203"}, "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-c6cce6ce37e63fae", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/workflow/useWorkflowJob.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/workflow/useWorkflowJob.ts:33"}, "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-15e628d843c36253", "name": "Commented-code block (5 lines) in apps/web/src/features/social/draftContent.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/features/social/draftContent.ts:1"}, "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-2e4f0e07c65fa035", "name": "Commented-code block (6 lines) in apps/web/src/features/idea-capture/useIdeaCapture.ts:35", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/features/idea-capture/useIdeaCapture.ts:35"}, "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-b109b30210672d55", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/idea-capture/useIdeaCapture.ts:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/idea-capture/useIdeaCapture.ts:64"}, "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-db8535fb395aa462", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/post-editor/usePostEditor.ts:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/post-editor/usePostEditor.ts:129"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2094fac1a802ae70", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/posts-list/usePostsList.ts:240", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/posts-list/usePostsList.ts:240"}, "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-f2769a733208dfb9", "name": "Commented-code block (5 lines) in packages/shared/src/socialConnections.ts:78", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared/src/socialConnections.ts:78"}, "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-dd688632063aa285", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/storage.ts:240", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/storage.ts:240"}, "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-a8a15a9af4d67584", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/linkedinApi.ts:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/linkedinApi.ts:78"}, "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-7516f0e8b9e34e17", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/telegramApi.ts:157", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/telegramApi.ts:157"}, "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-9f4dbb14d5a4fa97", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/imageGeneration.ts:121", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/imageGeneration.ts:121"}, "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-02bdb82c60fa1b9a", "name": "Commented-code block (6 lines) in packages/shared/src/twitterApi.ts:940", "shortDescription": {"text": "Commented-code block (6 lines) in packages/shared/src/twitterApi.ts:940"}, "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-733280577bbb5247", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/twitterApi.ts:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/twitterApi.ts:74"}, "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-a36034f42c6ee904", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/threadsApi.ts:125", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/threadsApi.ts:125"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-640ff067341f87f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/instagramUsername.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/instagramUsername.ts:31"}, "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-80f60bf20493c348", "name": "Commented-code block (5 lines) in packages/shared/src/prisma.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared/src/prisma.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7500124bd915c483", "name": "Dangling fetch: POST https://realtime.oxylabs.io/v1/queries (apps/api/src/article-pipeline/citation-validator.ts:129)", "shortDescription": {"text": "Dangling fetch: POST https://realtime.oxylabs.io/v1/queries (apps/api/src/article-pipeline/citation-validator.ts:129)"}, "fullDescription": {"text": "`apps/api/src/article-pipeline/citation-validator.ts:129` calls `POST https://realtime.oxylabs.io/v1/queries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/realtime.oxylabs.io/v1/queries`\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-4fe11b391bac2bc0", "name": "Dangling fetch: POST https://api.resend.com/emails (apps/api/src/lib/alerts.ts:51)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (apps/api/src/lib/alerts.ts:51)"}, "fullDescription": {"text": "`apps/api/src/lib/alerts.ts:51` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7ff4e1e1e3556e60", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/routes/ai.ts:190)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/routes/ai.ts:190)"}, "fullDescription": {"text": "`apps/api/src/routes/ai.ts:190` calls `POST https://openrouter.ai/api/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:/openrouter.ai/api/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-fd00051961b96442", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/routes/ai.ts:525)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/routes/ai.ts:525)"}, "fullDescription": {"text": "`apps/api/src/routes/ai.ts:525` calls `POST https://openrouter.ai/api/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:/openrouter.ai/api/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-6456b2530d387335", "name": "Dangling fetch: GET /admin/queues.json (apps/api/src/routes/admin.ts:76)", "shortDescription": {"text": "Dangling fetch: GET /admin/queues.json (apps/api/src/routes/admin.ts:76)"}, "fullDescription": {"text": "`apps/api/src/routes/admin.ts:76` calls `GET /admin/queues.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/queues.json`\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-6706b77805a22e5e", "name": "Dangling fetch: GET /admin/pg-stats.json (apps/api/src/routes/admin.ts:77)", "shortDescription": {"text": "Dangling fetch: GET /admin/pg-stats.json (apps/api/src/routes/admin.ts:77)"}, "fullDescription": {"text": "`apps/api/src/routes/admin.ts:77` calls `GET /admin/pg-stats.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/pg-stats.json`\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-dc1c313d78c08669", "name": "Dangling fetch: GET /admin/recent-failures.json (apps/api/src/routes/admin.ts:78)", "shortDescription": {"text": "Dangling fetch: GET /admin/recent-failures.json (apps/api/src/routes/admin.ts:78)"}, "fullDescription": {"text": "`apps/api/src/routes/admin.ts:78` calls `GET /admin/recent-failures.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/recent-failures.json`\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-dc871551b5b38139", "name": "Dangling fetch: POST /api/posts/${postId}/sync-analytics (apps/web/src/components/PostAnalytics.tsx:45)", "shortDescription": {"text": "Dangling fetch: POST /api/posts/${postId}/sync-analytics (apps/web/src/components/PostAnalytics.tsx:45)"}, "fullDescription": {"text": "`apps/web/src/components/PostAnalytics.tsx:45` calls `POST /api/posts/${postId}/sync-analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts/<p>/sync-analytics`\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-08d9f3ca3d0fa41b", "name": "Dangling fetch: PATCH /api/articles/${jobId}/content (apps/web/src/components/ArticleEditor.tsx:164)", "shortDescription": {"text": "Dangling fetch: PATCH /api/articles/${jobId}/content (apps/web/src/components/ArticleEditor.tsx:164)"}, "fullDescription": {"text": "`apps/web/src/components/ArticleEditor.tsx:164` calls `PATCH /api/articles/${jobId}/content` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/articles/<p>/content`\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-7d26aae65854e5bb", "name": "Dangling fetch: GET /api/settings (apps/web/src/components/ImageGenerationModal.tsx:151)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (apps/web/src/components/ImageGenerationModal.tsx:151)"}, "fullDescription": {"text": "`apps/web/src/components/ImageGenerationModal.tsx:151` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-374f560cf220e581", "name": "Dangling fetch: PATCH /api/settings (apps/web/src/components/ImageGenerationModal.tsx:205)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/components/ImageGenerationModal.tsx:205)"}, "fullDescription": {"text": "`apps/web/src/components/ImageGenerationModal.tsx:205` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-4ff9cca95446eef0", "name": "Dangling fetch: GET /api/ai/models/${provider} (apps/web/src/components/ImageGenerationModal.tsx:224)", "shortDescription": {"text": "Dangling fetch: GET /api/ai/models/${provider} (apps/web/src/components/ImageGenerationModal.tsx:224)"}, "fullDescription": {"text": "`apps/web/src/components/ImageGenerationModal.tsx:224` calls `GET /api/ai/models/${provider}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/models/<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-c8bec93e5d2b06cf", "name": "Dangling fetch: GET /api/api-keys (apps/web/src/components/ImageGenerationModal.tsx:243)", "shortDescription": {"text": "Dangling fetch: GET /api/api-keys (apps/web/src/components/ImageGenerationModal.tsx:243)"}, "fullDescription": {"text": "`apps/web/src/components/ImageGenerationModal.tsx:243` calls `GET /api/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/api-keys`\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-75d8a3bfa8552fdf", "name": "Dangling fetch: GET /api/ai/models/${llmProvider} (apps/web/src/components/ImageGenerationModal.tsx:275)", "shortDescription": {"text": "Dangling fetch: GET /api/ai/models/${llmProvider} (apps/web/src/components/ImageGenerationModal.tsx:275)"}, "fullDescription": {"text": "`apps/web/src/components/ImageGenerationModal.tsx:275` calls `GET /api/ai/models/${llmProvider}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/models/<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-c111fd0d4ca68961", "name": "Dangling fetch: POST /api/images/generate-prompt (apps/web/src/components/ImageGenerationModal.tsx:302)", "shortDescription": {"text": "Dangling fetch: POST /api/images/generate-prompt (apps/web/src/components/ImageGenerationModal.tsx:302)"}, "fullDescription": {"text": "`apps/web/src/components/ImageGenerationModal.tsx:302` calls `POST /api/images/generate-prompt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images/generate-prompt`\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-e197eb544c322efb", "name": "Dangling fetch: POST /api/images/generate (apps/web/src/components/ImageGenerationModal.tsx:355)", "shortDescription": {"text": "Dangling fetch: POST /api/images/generate (apps/web/src/components/ImageGenerationModal.tsx:355)"}, "fullDescription": {"text": "`apps/web/src/components/ImageGenerationModal.tsx:355` calls `POST /api/images/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images/generate`\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-b5a03391c54a5e4e", "name": "Dangling fetch: POST /api/social-automation/${runId}/retry/${slotKey} (apps/web/src/components/CalendarDayView.tsx:62)", "shortDescription": {"text": "Dangling fetch: POST /api/social-automation/${runId}/retry/${slotKey} (apps/web/src/components/CalendarDayView.tsx:62)"}, "fullDescription": {"text": "`apps/web/src/components/CalendarDayView.tsx:62` calls `POST /api/social-automation/${runId}/retry/${slotKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/social-automation/<p>/retry/<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-f806661b2757bcd9", "name": "Dangling fetch: GET /api/settings (apps/web/src/components/Sidebar.tsx:49)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (apps/web/src/components/Sidebar.tsx:49)"}, "fullDescription": {"text": "`apps/web/src/components/Sidebar.tsx:49` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-250241329f982ed2", "name": "Dangling fetch: GET /api/auth/sync-user (apps/web/src/components/Sidebar.tsx:74)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/sync-user (apps/web/src/components/Sidebar.tsx:74)"}, "fullDescription": {"text": "`apps/web/src/components/Sidebar.tsx:74` calls `GET /api/auth/sync-user` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/sync-user`\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-74ab36844f5d5421", "name": "Dangling fetch: PATCH /api/settings (apps/web/src/components/Sidebar.tsx:107)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/components/Sidebar.tsx:107)"}, "fullDescription": {"text": "`apps/web/src/components/Sidebar.tsx:107` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-13f320de6683b5e0", "name": "Dangling fetch: GET /api/settings (apps/web/src/components/ThemeProvider.tsx:23)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (apps/web/src/components/ThemeProvider.tsx:23)"}, "fullDescription": {"text": "`apps/web/src/components/ThemeProvider.tsx:23` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-65da432b4cd5fba6", "name": "Dangling fetch: PATCH /api/settings (apps/web/src/components/ThemeProvider.tsx:63)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/components/ThemeProvider.tsx:63)"}, "fullDescription": {"text": "`apps/web/src/components/ThemeProvider.tsx:63` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-b2a1c3ec290a318e", "name": "Dangling fetch: GET https://api.anthropic.com/v1/models (apps/web/src/app/api/ai/models/[provider]/route.ts:130)", "shortDescription": {"text": "Dangling fetch: GET https://api.anthropic.com/v1/models (apps/web/src/app/api/ai/models/[provider]/route.ts:130)"}, "fullDescription": {"text": "`apps/web/src/app/api/ai/models/[provider]/route.ts:130` calls `GET https://api.anthropic.com/v1/models` 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.anthropic.com/v1/models`\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-c19a30f6ae9cf329", "name": "Dangling fetch: GET https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey} (apps/web/src/app/api/ai/model", "shortDescription": {"text": "Dangling fetch: GET https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey} (apps/web/src/app/api/ai/models/[provider]/route.ts:172)"}, "fullDescription": {"text": "`apps/web/src/app/api/ai/models/[provider]/route.ts:172` calls `GET https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/generativelanguage.googleapis.com/v1beta/models`\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-f0c24718011f7f92", "name": "Dangling fetch: GET https://openrouter.ai/api/v1/models (apps/web/src/app/api/ai/models/[provider]/route.ts:212)", "shortDescription": {"text": "Dangling fetch: GET https://openrouter.ai/api/v1/models (apps/web/src/app/api/ai/models/[provider]/route.ts:212)"}, "fullDescription": {"text": "`apps/web/src/app/api/ai/models/[provider]/route.ts:212` calls `GET https://openrouter.ai/api/v1/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openrouter.ai/api/v1/models`\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-05951becd1f35418", "name": "Dangling fetch: GET https://api.replicate.com/v1/models (apps/web/src/app/api/ai/models/[provider]/route.ts:280)", "shortDescription": {"text": "Dangling fetch: GET https://api.replicate.com/v1/models (apps/web/src/app/api/ai/models/[provider]/route.ts:280)"}, "fullDescription": {"text": "`apps/web/src/app/api/ai/models/[provider]/route.ts:280` calls `GET https://api.replicate.com/v1/models` 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.replicate.com/v1/models`\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-2d57d9ffd45fab8d", "name": "Dangling fetch: DELETE /api/wp/connections/${id} (apps/web/src/app/(protected)/settings/wordpress/page.tsx:50)", "shortDescription": {"text": "Dangling fetch: DELETE /api/wp/connections/${id} (apps/web/src/app/(protected)/settings/wordpress/page.tsx:50)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/settings/wordpress/page.tsx:50` calls `DELETE /api/wp/connections/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wp/connections/<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-2e7791ca3c2ac70c", "name": "Dangling fetch: POST /api/wp/connections/${id}/verify (apps/web/src/app/(protected)/settings/wordpress/page.tsx:61)", "shortDescription": {"text": "Dangling fetch: POST /api/wp/connections/${id}/verify (apps/web/src/app/(protected)/settings/wordpress/page.tsx:61)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/settings/wordpress/page.tsx:61` calls `POST /api/wp/connections/${id}/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wp/connections/<p>/verify`\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-7782d7236e804341", "name": "Dangling fetch: GET /api/templates (apps/web/src/app/(protected)/templates/page.tsx:39)", "shortDescription": {"text": "Dangling fetch: GET /api/templates (apps/web/src/app/(protected)/templates/page.tsx:39)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/templates/page.tsx:39` calls `GET /api/templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates`\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-fd74d46e5d9928e3", "name": "Dangling fetch: GET /api/templates/${templateId} (apps/web/src/app/(protected)/templates/page.tsx:63)", "shortDescription": {"text": "Dangling fetch: GET /api/templates/${templateId} (apps/web/src/app/(protected)/templates/page.tsx:63)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/templates/page.tsx:63` calls `GET /api/templates/${templateId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates/<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-672975086726e277", "name": "Dangling fetch: POST /api/templates/seed (apps/web/src/app/(protected)/templates/page.tsx:76)", "shortDescription": {"text": "Dangling fetch: POST /api/templates/seed (apps/web/src/app/(protected)/templates/page.tsx:76)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/templates/page.tsx:76` calls `POST /api/templates/seed` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates/seed`\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-562ba495f9e3275c", "name": "Dangling fetch: POST /api/templates/update-platforms (apps/web/src/app/(protected)/templates/page.tsx:92)", "shortDescription": {"text": "Dangling fetch: POST /api/templates/update-platforms (apps/web/src/app/(protected)/templates/page.tsx:92)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/templates/page.tsx:92` calls `POST /api/templates/update-platforms` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates/update-platforms`\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-4c2f3ba01419d69b", "name": "Dangling fetch: DELETE /api/templates/${id} (apps/web/src/app/(protected)/templates/page.tsx:118)", "shortDescription": {"text": "Dangling fetch: DELETE /api/templates/${id} (apps/web/src/app/(protected)/templates/page.tsx:118)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/templates/page.tsx:118` calls `DELETE /api/templates/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates/<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-79724d977216d3e6", "name": "Dangling fetch: PATCH /api/templates/${id} (apps/web/src/app/(protected)/templates/page.tsx:138)", "shortDescription": {"text": "Dangling fetch: PATCH /api/templates/${id} (apps/web/src/app/(protected)/templates/page.tsx:138)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/templates/page.tsx:138` calls `PATCH /api/templates/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates/<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-44bee6057f9b354f", "name": "Dangling fetch: PATCH /api/templates/${editingTemplate.id} (apps/web/src/app/(protected)/templates/page.tsx:188)", "shortDescription": {"text": "Dangling fetch: PATCH /api/templates/${editingTemplate.id} (apps/web/src/app/(protected)/templates/page.tsx:188)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/templates/page.tsx:188` calls `PATCH /api/templates/${editingTemplate.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates/<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-756c331f27aa9600", "name": "Dangling fetch: POST /api/templates (apps/web/src/app/(protected)/templates/page.tsx:202)", "shortDescription": {"text": "Dangling fetch: POST /api/templates (apps/web/src/app/(protected)/templates/page.tsx:202)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/templates/page.tsx:202` calls `POST /api/templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates`\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-4f73e44ceb972c11", "name": "Dangling fetch: GET /api/drafts (apps/web/src/app/(protected)/account/page.tsx:21)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts (apps/web/src/app/(protected)/account/page.tsx:21)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/account/page.tsx:21` calls `GET /api/drafts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts`\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-84938cb6cd422f61", "name": "Dangling fetch: GET /api/posts (apps/web/src/app/(protected)/account/page.tsx:22)", "shortDescription": {"text": "Dangling fetch: GET /api/posts (apps/web/src/app/(protected)/account/page.tsx:22)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/account/page.tsx:22` calls `GET /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-fa416d52d913fd79", "name": "Dangling fetch: DELETE /api/media/${item.id} (apps/web/src/app/(protected)/images/page.tsx:118)", "shortDescription": {"text": "Dangling fetch: DELETE /api/media/${item.id} (apps/web/src/app/(protected)/images/page.tsx:118)"}, "fullDescription": {"text": "`apps/web/src/app/(protected)/images/page.tsx:118` calls `DELETE /api/media/${item.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/media/<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-dc247d5561a64d2e", "name": "Dangling fetch: PATCH /api/admin/users/${userId} (apps/web/src/app/admin/users/RoleToggle.tsx:19)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/users/${userId} (apps/web/src/app/admin/users/RoleToggle.tsx:19)"}, "fullDescription": {"text": "`apps/web/src/app/admin/users/RoleToggle.tsx:19` calls `PATCH /api/admin/users/${userId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<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-156cbfc63ec14479", "name": "Dangling fetch: PATCH /api/admin/errors/${errorId} (apps/web/src/app/admin/errors/ResolveButton.tsx:16)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/errors/${errorId} (apps/web/src/app/admin/errors/ResolveButton.tsx:16)"}, "fullDescription": {"text": "`apps/web/src/app/admin/errors/ResolveButton.tsx:16` calls `PATCH /api/admin/errors/${errorId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/errors/<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-8cc375eea9757113", "name": "Dangling fetch: GET /api/admin/schema-type-rules (apps/web/src/app/admin/schema-rules/page.tsx:25)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/schema-type-rules (apps/web/src/app/admin/schema-rules/page.tsx:25)"}, "fullDescription": {"text": "`apps/web/src/app/admin/schema-rules/page.tsx:25` calls `GET /api/admin/schema-type-rules` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/schema-type-rules`\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-6dc75844152a31c4", "name": "Dangling fetch: PUT /api/admin/schema-type-rules (apps/web/src/app/admin/schema-rules/page.tsx:56)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/schema-type-rules (apps/web/src/app/admin/schema-rules/page.tsx:56)"}, "fullDescription": {"text": "`apps/web/src/app/admin/schema-rules/page.tsx:56` calls `PUT /api/admin/schema-type-rules` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/schema-type-rules`\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-6cd365a5923041e0", "name": "Dangling fetch: GET /api/admin/prompts (apps/web/src/app/admin/prompts/page.tsx:138)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/prompts (apps/web/src/app/admin/prompts/page.tsx:138)"}, "fullDescription": {"text": "`apps/web/src/app/admin/prompts/page.tsx:138` calls `GET /api/admin/prompts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/prompts`\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-ce2a9cb304972c52", "name": "Dangling fetch: PUT /api/admin/prompts/${template.stepNumber} (apps/web/src/app/admin/prompts/[stepNumber]/PromptEditor.", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/prompts/${template.stepNumber} (apps/web/src/app/admin/prompts/[stepNumber]/PromptEditor.tsx:322)"}, "fullDescription": {"text": "`apps/web/src/app/admin/prompts/[stepNumber]/PromptEditor.tsx:322` calls `PUT /api/admin/prompts/${template.stepNumber}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/prompts/<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-d5d2178d8ce15486", "name": "Dangling fetch: GET /api/admin/prompts/${stepNumber} (apps/web/src/app/admin/prompts/[stepNumber]/page.tsx:39)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/prompts/${stepNumber} (apps/web/src/app/admin/prompts/[stepNumber]/page.tsx:39)"}, "fullDescription": {"text": "`apps/web/src/app/admin/prompts/[stepNumber]/page.tsx:39` calls `GET /api/admin/prompts/${stepNumber}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/prompts/<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-02e7a472cd032ca9", "name": "Dangling fetch: PUT /api/admin/outline-frameworks/${framework.number} (apps/web/src/app/admin/outline-frameworks/page.ts", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/outline-frameworks/${framework.number} (apps/web/src/app/admin/outline-frameworks/page.tsx:72)"}, "fullDescription": {"text": "`apps/web/src/app/admin/outline-frameworks/page.tsx:72` calls `PUT /api/admin/outline-frameworks/${framework.number}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/outline-frameworks/<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-13e6741efbdc6803", "name": "Dangling fetch: PUT /api/admin/platform-settings (apps/web/src/app/admin/outline-frameworks/page.tsx:220)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/platform-settings (apps/web/src/app/admin/outline-frameworks/page.tsx:220)"}, "fullDescription": {"text": "`apps/web/src/app/admin/outline-frameworks/page.tsx:220` calls `PUT /api/admin/platform-settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/platform-settings`\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-4c71ae26b5a35e90", "name": "Dangling fetch: GET /api/admin/outline-frameworks (apps/web/src/app/admin/outline-frameworks/page.tsx:298)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/outline-frameworks (apps/web/src/app/admin/outline-frameworks/page.tsx:298)"}, "fullDescription": {"text": "`apps/web/src/app/admin/outline-frameworks/page.tsx:298` calls `GET /api/admin/outline-frameworks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/outline-frameworks`\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-b34208f73d86653b", "name": "Dangling fetch: GET /api/admin/platform-settings (apps/web/src/app/admin/outline-frameworks/page.tsx:299)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/platform-settings (apps/web/src/app/admin/outline-frameworks/page.tsx:299)"}, "fullDescription": {"text": "`apps/web/src/app/admin/outline-frameworks/page.tsx:299` calls `GET /api/admin/platform-settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/platform-settings`\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-ddf7036e8c90e970", "name": "Dangling fetch: GET /api/admin/music (apps/web/src/app/admin/music/page.tsx:32)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/music (apps/web/src/app/admin/music/page.tsx:32)"}, "fullDescription": {"text": "`apps/web/src/app/admin/music/page.tsx:32` calls `GET /api/admin/music` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/music`\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-47af2c60f105d07b", "name": "Dangling fetch: POST /api/admin/music (apps/web/src/app/admin/music/page.tsx:63)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/music (apps/web/src/app/admin/music/page.tsx:63)"}, "fullDescription": {"text": "`apps/web/src/app/admin/music/page.tsx:63` calls `POST /api/admin/music` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/music`\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-9f6bf0e226ccc0b3", "name": "Dangling fetch: PATCH /api/admin/music/${track.id} (apps/web/src/app/admin/music/page.tsx:86)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/music/${track.id} (apps/web/src/app/admin/music/page.tsx:86)"}, "fullDescription": {"text": "`apps/web/src/app/admin/music/page.tsx:86` calls `PATCH /api/admin/music/${track.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/music/<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-4fa1778df541da57", "name": "Dangling fetch: DELETE /api/admin/music/${track.id} (apps/web/src/app/admin/music/page.tsx:106)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/music/${track.id} (apps/web/src/app/admin/music/page.tsx:106)"}, "fullDescription": {"text": "`apps/web/src/app/admin/music/page.tsx:106` calls `DELETE /api/admin/music/${track.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/music/<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-d464d9013c0495b7", "name": "Dangling fetch: GET /api/admin/llm-keys (apps/web/src/app/admin/llm/page.tsx:34)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/llm-keys (apps/web/src/app/admin/llm/page.tsx:34)"}, "fullDescription": {"text": "`apps/web/src/app/admin/llm/page.tsx:34` calls `GET /api/admin/llm-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/llm-keys`\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-b9d374d8da3f410d", "name": "Dangling fetch: PUT /api/admin/llm-keys/${provider} (apps/web/src/app/admin/llm/page.tsx:53)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/llm-keys/${provider} (apps/web/src/app/admin/llm/page.tsx:53)"}, "fullDescription": {"text": "`apps/web/src/app/admin/llm/page.tsx:53` calls `PUT /api/admin/llm-keys/${provider}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/llm-keys/<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-bc7388d5db173c8e", "name": "Dangling fetch: POST /api/admin/llm-keys/migrate (apps/web/src/app/admin/llm/page.tsx:72)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/llm-keys/migrate (apps/web/src/app/admin/llm/page.tsx:72)"}, "fullDescription": {"text": "`apps/web/src/app/admin/llm/page.tsx:72` calls `POST /api/admin/llm-keys/migrate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/llm-keys/migrate`\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-0eb38bc6e33ef938", "name": "Dangling fetch: POST /api/ai/generate (apps/web/src/lib/mockAI.ts:55)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/generate (apps/web/src/lib/mockAI.ts:55)"}, "fullDescription": {"text": "`apps/web/src/lib/mockAI.ts:55` calls `POST /api/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/generate`\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-b19aea147dda3e32", "name": "Dangling fetch: GET /api/social/${platform}/pages (apps/web/src/features/settings/useSocialConnections.ts:67)", "shortDescription": {"text": "Dangling fetch: GET /api/social/${platform}/pages (apps/web/src/features/settings/useSocialConnections.ts:67)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSocialConnections.ts:67` calls `GET /api/social/${platform}/pages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/social/<p>/pages`\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-88348c909f581d87", "name": "Dangling fetch: PATCH /api/social/${platform}/settings (apps/web/src/features/settings/useSocialConnections.ts:158)", "shortDescription": {"text": "Dangling fetch: PATCH /api/social/${platform}/settings (apps/web/src/features/settings/useSocialConnections.ts:158)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSocialConnections.ts:158` calls `PATCH /api/social/${platform}/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/social/<p>/settings`\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-5c5b5963da196dc2", "name": "Dangling fetch: GET /api/social/connections (apps/web/src/features/settings/useSocialConnections.ts:193)", "shortDescription": {"text": "Dangling fetch: GET /api/social/connections (apps/web/src/features/settings/useSocialConnections.ts:193)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSocialConnections.ts:193` calls `GET /api/social/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/social/connections`\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-61d4569de12d7b87", "name": "Dangling fetch: POST /api/api-keys (apps/web/src/features/settings/TelegramRow.tsx:36)", "shortDescription": {"text": "Dangling fetch: POST /api/api-keys (apps/web/src/features/settings/TelegramRow.tsx:36)"}, "fullDescription": {"text": "`apps/web/src/features/settings/TelegramRow.tsx:36` calls `POST /api/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/api-keys`\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-8e555cf2699f1978", "name": "Dangling fetch: DELETE /api/api-keys (apps/web/src/features/settings/TelegramRow.tsx:69)", "shortDescription": {"text": "Dangling fetch: DELETE /api/api-keys (apps/web/src/features/settings/TelegramRow.tsx:69)"}, "fullDescription": {"text": "`apps/web/src/features/settings/TelegramRow.tsx:69` calls `DELETE /api/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/api-keys`\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-c2a8af9f143e7e1e", "name": "Dangling fetch: PATCH /api/settings (apps/web/src/features/settings/TelegramRow.tsx:152)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/features/settings/TelegramRow.tsx:152)"}, "fullDescription": {"text": "`apps/web/src/features/settings/TelegramRow.tsx:152` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-e0f52dde7d18844a", "name": "Dangling fetch: DELETE /api/social/${platform} (apps/web/src/features/settings/PlatformConnectionRow.tsx:103)", "shortDescription": {"text": "Dangling fetch: DELETE /api/social/${platform} (apps/web/src/features/settings/PlatformConnectionRow.tsx:103)"}, "fullDescription": {"text": "`apps/web/src/features/settings/PlatformConnectionRow.tsx:103` calls `DELETE /api/social/${platform}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/social/<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-3a1789416232f3ca", "name": "Dangling fetch: POST /api/social/instagram/refresh-username (apps/web/src/features/settings/PlatformConnectionRow.tsx:22", "shortDescription": {"text": "Dangling fetch: POST /api/social/instagram/refresh-username (apps/web/src/features/settings/PlatformConnectionRow.tsx:225)"}, "fullDescription": {"text": "`apps/web/src/features/settings/PlatformConnectionRow.tsx:225` calls `POST /api/social/instagram/refresh-username` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/social/instagram/refresh-username`\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-7bc5b34223e0e8fe", "name": "Dangling fetch: GET /api/settings (apps/web/src/features/settings/useSettingsData.ts:91)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (apps/web/src/features/settings/useSettingsData.ts:91)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:91` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-23795405147c35a9", "name": "Dangling fetch: GET /api/api-keys (apps/web/src/features/settings/useSettingsData.ts:92)", "shortDescription": {"text": "Dangling fetch: GET /api/api-keys (apps/web/src/features/settings/useSettingsData.ts:92)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:92` calls `GET /api/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/api-keys`\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-b2c374684e8ba699", "name": "Dangling fetch: GET /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:93)", "shortDescription": {"text": "Dangling fetch: GET /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:93)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:93` calls `GET /api/brand-settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/brand-settings`\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-20e92699915fbdca", "name": "Dangling fetch: PATCH /api/settings (apps/web/src/features/settings/useSettingsData.ts:165)", "shortDescription": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/features/settings/useSettingsData.ts:165)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:165` calls `PATCH /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-d6ddf49fdf5ef2ce", "name": "Dangling fetch: POST /api/ai/analyze-writing-style (apps/web/src/features/settings/useSettingsData.ts:198)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/analyze-writing-style (apps/web/src/features/settings/useSettingsData.ts:198)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:198` calls `POST /api/ai/analyze-writing-style` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/analyze-writing-style`\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-24b472173fc82a13", "name": "Dangling fetch: POST /api/brand-settings/logo (apps/web/src/features/settings/useSettingsData.ts:247)", "shortDescription": {"text": "Dangling fetch: POST /api/brand-settings/logo (apps/web/src/features/settings/useSettingsData.ts:247)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:247` calls `POST /api/brand-settings/logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/brand-settings/logo`\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-5a43c377d4003737", "name": "Dangling fetch: DELETE /api/brand-settings/logo (apps/web/src/features/settings/useSettingsData.ts:261)", "shortDescription": {"text": "Dangling fetch: DELETE /api/brand-settings/logo (apps/web/src/features/settings/useSettingsData.ts:261)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:261` calls `DELETE /api/brand-settings/logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/brand-settings/logo`\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-8456b3cfc4a9bda1", "name": "Dangling fetch: POST /api/brand-settings/social-logo (apps/web/src/features/settings/useSettingsData.ts:289)", "shortDescription": {"text": "Dangling fetch: POST /api/brand-settings/social-logo (apps/web/src/features/settings/useSettingsData.ts:289)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:289` calls `POST /api/brand-settings/social-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/brand-settings/social-logo`\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-5097af1bb8f33c0f", "name": "Dangling fetch: DELETE /api/brand-settings/social-logo (apps/web/src/features/settings/useSettingsData.ts:303)", "shortDescription": {"text": "Dangling fetch: DELETE /api/brand-settings/social-logo (apps/web/src/features/settings/useSettingsData.ts:303)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:303` calls `DELETE /api/brand-settings/social-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/brand-settings/social-logo`\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-929cdec85b43835a", "name": "Dangling fetch: PATCH /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:315)", "shortDescription": {"text": "Dangling fetch: PATCH /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:315)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:315` calls `PATCH /api/brand-settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/brand-settings`\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-baefb202e3326a36", "name": "Dangling fetch: PATCH /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:373)", "shortDescription": {"text": "Dangling fetch: PATCH /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:373)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:373` calls `PATCH /api/brand-settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/brand-settings`\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-19c4594428ba2823", "name": "Dangling fetch: PATCH /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:399)", "shortDescription": {"text": "Dangling fetch: PATCH /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:399)"}, "fullDescription": {"text": "`apps/web/src/features/settings/useSettingsData.ts:399` calls `PATCH /api/brand-settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/brand-settings`\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-c68d696a05cec797", "name": "Dangling fetch: POST https://graph.threads.net/oauth/access_token (apps/web/src/features/social-callbacks/threads.ts:20)", "shortDescription": {"text": "Dangling fetch: POST https://graph.threads.net/oauth/access_token (apps/web/src/features/social-callbacks/threads.ts:20)"}, "fullDescription": {"text": "`apps/web/src/features/social-callbacks/threads.ts:20` calls `POST https://graph.threads.net/oauth/access_token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.threads.net/oauth/access_token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07380ae1a9d41979", "name": "Dangling fetch: POST https://www.linkedin.com/oauth/v2/accessToken (apps/web/src/features/social-callbacks/linkedin.ts:3", "shortDescription": {"text": "Dangling fetch: POST https://www.linkedin.com/oauth/v2/accessToken (apps/web/src/features/social-callbacks/linkedin.ts:39)"}, "fullDescription": {"text": "`apps/web/src/features/social-callbacks/linkedin.ts:39` calls `POST https://www.linkedin.com/oauth/v2/accessToken` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.linkedin.com/oauth/v2/accesstoken`\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-b4cdcd1af5f0f98e", "name": "Dangling fetch: GET https://api.linkedin.com/v2/userinfo (apps/web/src/features/social-callbacks/linkedin.ts:90)", "shortDescription": {"text": "Dangling fetch: GET https://api.linkedin.com/v2/userinfo (apps/web/src/features/social-callbacks/linkedin.ts:90)"}, "fullDescription": {"text": "`apps/web/src/features/social-callbacks/linkedin.ts:90` calls `GET https://api.linkedin.com/v2/userinfo` 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.linkedin.com/v2/userinfo`\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-24e81f01ec21121f", "name": "Dangling fetch: POST https://api.twitter.com/2/oauth2/token (apps/web/src/features/social-callbacks/twitter.ts:28)", "shortDescription": {"text": "Dangling fetch: POST https://api.twitter.com/2/oauth2/token (apps/web/src/features/social-callbacks/twitter.ts:28)"}, "fullDescription": {"text": "`apps/web/src/features/social-callbacks/twitter.ts:28` calls `POST https://api.twitter.com/2/oauth2/token` 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.twitter.com/<p>/oauth2/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-850c80a0dfcb1191", "name": "Dangling fetch: GET https://api.twitter.com/2/users/me?user.fields=username,name (apps/web/src/features/social-callbacks", "shortDescription": {"text": "Dangling fetch: GET https://api.twitter.com/2/users/me?user.fields=username,name (apps/web/src/features/social-callbacks/twitter.ts:57)"}, "fullDescription": {"text": "`apps/web/src/features/social-callbacks/twitter.ts:57` calls `GET https://api.twitter.com/2/users/me?user.fields=username,name` 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.twitter.com/<p>/users/me`\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-cbd23299b31104e4", "name": "Dangling fetch: PATCH /api/drafts/${currentDraftId} (apps/web/src/features/dashboard/useDashboard.ts:144)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${currentDraftId} (apps/web/src/features/dashboard/useDashboard.ts:144)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:144` calls `PATCH /api/drafts/${currentDraftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-a149c5209026465f", "name": "Dangling fetch: POST /api/drafts (apps/web/src/features/dashboard/useDashboard.ts:174)", "shortDescription": {"text": "Dangling fetch: POST /api/drafts (apps/web/src/features/dashboard/useDashboard.ts:174)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:174` calls `POST /api/drafts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts`\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-a16202e9648e4956", "name": "Dangling fetch: PATCH /api/drafts/${currentDraftId} (apps/web/src/features/dashboard/useDashboard.ts:270)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${currentDraftId} (apps/web/src/features/dashboard/useDashboard.ts:270)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:270` calls `PATCH /api/drafts/${currentDraftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-b96dff8c2dae516b", "name": "Dangling fetch: POST /api/drafts (apps/web/src/features/dashboard/useDashboard.ts:326)", "shortDescription": {"text": "Dangling fetch: POST /api/drafts (apps/web/src/features/dashboard/useDashboard.ts:326)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:326` calls `POST /api/drafts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts`\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-d9fc5ae49fca0ea2", "name": "Dangling fetch: PATCH /api/drafts/${draftId} (apps/web/src/features/dashboard/useDashboard.ts:393)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${draftId} (apps/web/src/features/dashboard/useDashboard.ts:393)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:393` calls `PATCH /api/drafts/${draftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-1529e570f5c49d87", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:408)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:408)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:408` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-71dd47119a1c93af", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:439)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:439)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:439` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-09628ad038ecb0a1", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:466)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:466)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:466` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-3448a9e79558d402", "name": "Dangling fetch: PATCH /api/drafts/${draftId} (apps/web/src/features/dashboard/useDashboard.ts:529)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${draftId} (apps/web/src/features/dashboard/useDashboard.ts:529)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:529` calls `PATCH /api/drafts/${draftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-ad24f353fc174337", "name": "Dangling fetch: GET /api/settings (apps/web/src/features/dashboard/useDashboard.ts:543)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (apps/web/src/features/dashboard/useDashboard.ts:543)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:543` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-21d7343372f61fd2", "name": "Dangling fetch: POST /api/posts/publish (apps/web/src/features/dashboard/useDashboard.ts:581)", "shortDescription": {"text": "Dangling fetch: POST /api/posts/publish (apps/web/src/features/dashboard/useDashboard.ts:581)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:581` calls `POST /api/posts/publish` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts/publish`\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-70ddfb6011b20774", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:607)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:607)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:607` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-b906bbbc075701d2", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:643)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:643)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:643` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-4586fdfb63944912", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:677)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:677)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:677` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-43eaac9843438681", "name": "Dangling fetch: GET /api/drafts/${draftId} (apps/web/src/features/dashboard/useDashboard.ts:712)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts/${draftId} (apps/web/src/features/dashboard/useDashboard.ts:712)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/useDashboard.ts:712` calls `GET /api/drafts/${draftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-0c040cdb6b2ff059", "name": "Dangling fetch: PATCH /api/drafts/${currentDraftId} (apps/web/src/features/dashboard/sections/DashboardInput.tsx:67)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${currentDraftId} (apps/web/src/features/dashboard/sections/DashboardInput.tsx:67)"}, "fullDescription": {"text": "`apps/web/src/features/dashboard/sections/DashboardInput.tsx:67` calls `PATCH /api/drafts/${currentDraftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-acfa368545208146", "name": "Dangling fetch: POST /api/articles/${jobId}/social-automation/${runId}/approve (apps/web/src/features/social/SocialPrevi", "shortDescription": {"text": "Dangling fetch: POST /api/articles/${jobId}/social-automation/${runId}/approve (apps/web/src/features/social/SocialPreviewPanel.tsx:358)"}, "fullDescription": {"text": "`apps/web/src/features/social/SocialPreviewPanel.tsx:358` calls `POST /api/articles/${jobId}/social-automation/${runId}/approve` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/articles/<p>/social-automation/<p>/approve`\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-2d38a29a7aa3704b", "name": "Dangling fetch: POST /api/social-automation/${runId}/approve/${slotKey} (apps/web/src/features/social/SocialPreviewPanel", "shortDescription": {"text": "Dangling fetch: POST /api/social-automation/${runId}/approve/${slotKey} (apps/web/src/features/social/SocialPreviewPanel.tsx:381)"}, "fullDescription": {"text": "`apps/web/src/features/social/SocialPreviewPanel.tsx:381` calls `POST /api/social-automation/${runId}/approve/${slotKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/social-automation/<p>/approve/<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-118e69f0700b86f0", "name": "Dangling fetch: POST /api/social-automation/${runId}/regenerate/${slotKey} (apps/web/src/features/social/SocialPreviewPa", "shortDescription": {"text": "Dangling fetch: POST /api/social-automation/${runId}/regenerate/${slotKey} (apps/web/src/features/social/SocialPreviewPanel.tsx:404)"}, "fullDescription": {"text": "`apps/web/src/features/social/SocialPreviewPanel.tsx:404` calls `POST /api/social-automation/${runId}/regenerate/${slotKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/social-automation/<p>/regenerate/<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-3c0b84dbd005e197", "name": "Dangling fetch: GET /api/social/connections (apps/web/src/features/idea-capture/useIdeaCapture.ts:64)", "shortDescription": {"text": "Dangling fetch: GET /api/social/connections (apps/web/src/features/idea-capture/useIdeaCapture.ts:64)"}, "fullDescription": {"text": "`apps/web/src/features/idea-capture/useIdeaCapture.ts:64` calls `GET /api/social/connections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/social/connections`\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-7408daa34b279ef2", "name": "Dangling fetch: GET /api/api-keys (apps/web/src/features/idea-capture/useIdeaCapture.ts:75)", "shortDescription": {"text": "Dangling fetch: GET /api/api-keys (apps/web/src/features/idea-capture/useIdeaCapture.ts:75)"}, "fullDescription": {"text": "`apps/web/src/features/idea-capture/useIdeaCapture.ts:75` calls `GET /api/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/api-keys`\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-7f8b0a783556fde3", "name": "Dangling fetch: POST /api/templates/seed (apps/web/src/features/idea-capture/useIdeaCapture.ts:97)", "shortDescription": {"text": "Dangling fetch: POST /api/templates/seed (apps/web/src/features/idea-capture/useIdeaCapture.ts:97)"}, "fullDescription": {"text": "`apps/web/src/features/idea-capture/useIdeaCapture.ts:97` calls `POST /api/templates/seed` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates/seed`\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-74266d76846d7001", "name": "Dangling fetch: GET /api/templates (apps/web/src/features/idea-capture/useIdeaCapture.ts:120)", "shortDescription": {"text": "Dangling fetch: GET /api/templates (apps/web/src/features/idea-capture/useIdeaCapture.ts:120)"}, "fullDescription": {"text": "`apps/web/src/features/idea-capture/useIdeaCapture.ts:120` calls `GET /api/templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/templates`\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-070bc13b15c13053", "name": "Dangling fetch: POST /api/images/upload (apps/web/src/features/idea-capture/useIdeaCapture.ts:281)", "shortDescription": {"text": "Dangling fetch: POST /api/images/upload (apps/web/src/features/idea-capture/useIdeaCapture.ts:281)"}, "fullDescription": {"text": "`apps/web/src/features/idea-capture/useIdeaCapture.ts:281` calls `POST /api/images/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images/upload`\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-8363053d38ba2e33", "name": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:38)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:38)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:38` calls `GET /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-dde79ae5b104a843", "name": "Dangling fetch: DELETE /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:65)", "shortDescription": {"text": "Dangling fetch: DELETE /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:65)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:65` calls `DELETE /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-e5f4039b06a693fe", "name": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:102)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:102)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:102` calls `PATCH /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-0897f1a9dad0ad24", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:129)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:129)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:129` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-338ff54c8861b785", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:155)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:155)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:155` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-b6e2f28f4a8b1206", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:182)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:182)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:182` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-e71b3c7ad7df563a", "name": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:203)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:203)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:203` calls `GET /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-74aa7409cecc6792", "name": "Dangling fetch: GET /api/settings (apps/web/src/features/post-editor/usePostEditor.ts:237)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (apps/web/src/features/post-editor/usePostEditor.ts:237)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:237` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-9d685074765ab3bb", "name": "Dangling fetch: POST /api/posts/publish (apps/web/src/features/post-editor/usePostEditor.ts:258)", "shortDescription": {"text": "Dangling fetch: POST /api/posts/publish (apps/web/src/features/post-editor/usePostEditor.ts:258)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:258` calls `POST /api/posts/publish` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts/publish`\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-c246efcef0055afe", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:288)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:288)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:288` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-9175061a72fc60ad", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:318)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:318)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:318` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-92f60176a1d6ee38", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:344)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:344)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:344` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-7a39680ffa3e6ea1", "name": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:369)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:369)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:369` calls `GET /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-74db20897da0af01", "name": "Dangling fetch: POST /api/posts/${publishedPost.id}/sync-analytics (apps/web/src/features/post-editor/usePostEditor.ts:4", "shortDescription": {"text": "Dangling fetch: POST /api/posts/${publishedPost.id}/sync-analytics (apps/web/src/features/post-editor/usePostEditor.ts:472)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:472` calls `POST /api/posts/${publishedPost.id}/sync-analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts/<p>/sync-analytics`\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-2b302462cc11facf", "name": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:485)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:485)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:485` calls `GET /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-2d43e259270bb55e", "name": "Dangling fetch: PATCH /api/posts/${postId} (apps/web/src/features/post-editor/usePostEditor.ts:515)", "shortDescription": {"text": "Dangling fetch: PATCH /api/posts/${postId} (apps/web/src/features/post-editor/usePostEditor.ts:515)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:515` calls `PATCH /api/posts/${postId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts/<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-6764f6e8a00356f6", "name": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:531)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:531)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:531` calls `GET /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-08c0980536160ce5", "name": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:593)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:593)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:593` calls `PATCH /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-bd33a5d5aae1cd26", "name": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:606)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:606)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:606` calls `GET /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-2a65dcf5799a1321", "name": "Dangling fetch: POST /api/images/upload (apps/web/src/features/post-editor/usePostEditor.ts:655)", "shortDescription": {"text": "Dangling fetch: POST /api/images/upload (apps/web/src/features/post-editor/usePostEditor.ts:655)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:655` calls `POST /api/images/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images/upload`\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-dc3eb4a4232725c3", "name": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:678)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:678)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:678` calls `PATCH /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-f10b779d67675215", "name": "Dangling fetch: DELETE /api/images/upload (apps/web/src/features/post-editor/usePostEditor.ts:731)", "shortDescription": {"text": "Dangling fetch: DELETE /api/images/upload (apps/web/src/features/post-editor/usePostEditor.ts:731)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:731` calls `DELETE /api/images/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images/upload`\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-57ac67ec81e248c2", "name": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:747)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:747)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:747` calls `PATCH /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-c764853d55dff85d", "name": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:792)", "shortDescription": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:792)"}, "fullDescription": {"text": "`apps/web/src/features/post-editor/usePostEditor.ts:792` calls `PATCH /api/drafts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-68dcd86f8d00daef", "name": "Dangling fetch: GET /api/drafts (apps/web/src/features/posts-list/usePostsList.ts:20)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts (apps/web/src/features/posts-list/usePostsList.ts:20)"}, "fullDescription": {"text": "`apps/web/src/features/posts-list/usePostsList.ts:20` calls `GET /api/drafts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts`\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-1fe99ed5a735ce20", "name": "Dangling fetch: DELETE /api/drafts/${draftId} (apps/web/src/features/posts-list/usePostsList.ts:116)", "shortDescription": {"text": "Dangling fetch: DELETE /api/drafts/${draftId} (apps/web/src/features/posts-list/usePostsList.ts:116)"}, "fullDescription": {"text": "`apps/web/src/features/posts-list/usePostsList.ts:116` calls `DELETE /api/drafts/${draftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-e8d2b70d5eea5c53", "name": "Dangling fetch: GET /api/drafts/${draftId} (apps/web/src/features/posts-list/usePostsList.ts:150)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts/${draftId} (apps/web/src/features/posts-list/usePostsList.ts:150)"}, "fullDescription": {"text": "`apps/web/src/features/posts-list/usePostsList.ts:150` calls `GET /api/drafts/${draftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-1140a8257dec004e", "name": "Dangling fetch: GET /api/settings (apps/web/src/features/posts-list/usePostsList.ts:225)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (apps/web/src/features/posts-list/usePostsList.ts:225)"}, "fullDescription": {"text": "`apps/web/src/features/posts-list/usePostsList.ts:225` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings`\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-b4732935b9c4d0d4", "name": "Dangling fetch: POST /api/posts/publish (apps/web/src/features/posts-list/usePostsList.ts:240)", "shortDescription": {"text": "Dangling fetch: POST /api/posts/publish (apps/web/src/features/posts-list/usePostsList.ts:240)"}, "fullDescription": {"text": "`apps/web/src/features/posts-list/usePostsList.ts:240` calls `POST /api/posts/publish` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts/publish`\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-c3c94d66c0e0aa24", "name": "Dangling fetch: GET /api/drafts/${draftId} (apps/web/src/features/posts-list/usePostsList.ts:308)", "shortDescription": {"text": "Dangling fetch: GET /api/drafts/${draftId} (apps/web/src/features/posts-list/usePostsList.ts:308)"}, "fullDescription": {"text": "`apps/web/src/features/posts-list/usePostsList.ts:308` calls `GET /api/drafts/${draftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/drafts/<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-af1cb18170c1326a", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/posts-list/usePostsList.ts:382)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/posts-list/usePostsList.ts:382)"}, "fullDescription": {"text": "`apps/web/src/features/posts-list/usePostsList.ts:382` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-9ca31da5d283b5c5", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/posts-list/usePostsList.ts:406)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/posts-list/usePostsList.ts:406)"}, "fullDescription": {"text": "`apps/web/src/features/posts-list/usePostsList.ts:406` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-cc2ccd2ee7a7184b", "name": "Dangling fetch: POST /api/posts (apps/web/src/features/posts-list/usePostsList.ts:447)", "shortDescription": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/posts-list/usePostsList.ts:447)"}, "fullDescription": {"text": "`apps/web/src/features/posts-list/usePostsList.ts:447` calls `POST /api/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts`\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-44957dad378cd286", "name": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (packages/shared/src/imageGeneration.ts:121)", "shortDescription": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (packages/shared/src/imageGeneration.ts:121)"}, "fullDescription": {"text": "`packages/shared/src/imageGeneration.ts:121` calls `POST https://openrouter.ai/api/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:/openrouter.ai/api/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-564fc12f1b6ad7ab", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (packages/shared/src/imageGeneration.ts:307)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (packages/shared/src/imageGeneration.ts:307)"}, "fullDescription": {"text": "`packages/shared/src/imageGeneration.ts:307` calls `POST https://api.openai.com/v1/images/generations` 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/images/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-efdb4652254266d0", "name": "Dangling fetch: POST https://api.replicate.com/v1/predictions (packages/shared/src/imageGeneration.ts:359)", "shortDescription": {"text": "Dangling fetch: POST https://api.replicate.com/v1/predictions (packages/shared/src/imageGeneration.ts:359)"}, "fullDescription": {"text": "`packages/shared/src/imageGeneration.ts:359` calls `POST https://api.replicate.com/v1/predictions` 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.replicate.com/v1/predictions`\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-d3be9dc10c4bdee5", "name": "Dangling fetch: GET https://api.replicate.com/v1/predictions/${predictionId} (packages/shared/src/imageGeneration.ts:393", "shortDescription": {"text": "Dangling fetch: GET https://api.replicate.com/v1/predictions/${predictionId} (packages/shared/src/imageGeneration.ts:393)"}, "fullDescription": {"text": "`packages/shared/src/imageGeneration.ts:393` calls `GET https://api.replicate.com/v1/predictions/${predictionId}` 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.replicate.com/v1/predictions/<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-eac6d91d3f1a389c", "name": "Dangling fetch: POST https://api.twitter.com/2/oauth2/token (packages/shared/src/twitterApi.ts:915)", "shortDescription": {"text": "Dangling fetch: POST https://api.twitter.com/2/oauth2/token (packages/shared/src/twitterApi.ts:915)"}, "fullDescription": {"text": "`packages/shared/src/twitterApi.ts:915` calls `POST https://api.twitter.com/2/oauth2/token` 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.twitter.com/<p>/oauth2/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-970eb92d6ec2bfaa", "name": "Unused endpoint: POST /generate", "shortDescription": {"text": "Unused endpoint: POST /generate"}, "fullDescription": {"text": "`apps/api/src/routes/ai.ts` declares `POST /generate` 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-7187270dbe26d6a3", "name": "Unused endpoint: POST /analyze-writing-style", "shortDescription": {"text": "Unused endpoint: POST /analyze-writing-style"}, "fullDescription": {"text": "`apps/api/src/routes/ai.ts` declares `POST /analyze-writing-style` 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-e3426bb34f344615", "name": "Unused endpoint: POST /generate-prompt", "shortDescription": {"text": "Unused endpoint: POST /generate-prompt"}, "fullDescription": {"text": "`apps/api/src/routes/images.ts` declares `POST /generate-prompt` 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-6236b283b79811b8", "name": "Unused endpoint: POST /upload", "shortDescription": {"text": "Unused endpoint: POST /upload"}, "fullDescription": {"text": "`apps/api/src/routes/images.ts` declares `POST /upload` 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-e7b69439a60cb2a4", "name": "Unused endpoint: DELETE /upload", "shortDescription": {"text": "Unused endpoint: DELETE /upload"}, "fullDescription": {"text": "`apps/api/src/routes/images.ts` declares `DELETE /upload` 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-4dd502cbd5c495a2", "name": "Unused endpoint: POST /social/generate/pitch", "shortDescription": {"text": "Unused endpoint: POST /social/generate/pitch"}, "fullDescription": {"text": "`apps/api/src/routes/social.ts` declares `POST /social/generate/pitch` 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-05a5ae732e0e48b8", "name": "Unused endpoint: POST /social/generate/video-reel", "shortDescription": {"text": "Unused endpoint: POST /social/generate/video-reel"}, "fullDescription": {"text": "`apps/api/src/routes/social.ts` declares `POST /social/generate/video-reel` 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-34f412bcb3d34319", "name": "Unused endpoint: POST /social/generate/hook-video", "shortDescription": {"text": "Unused endpoint: POST /social/generate/hook-video"}, "fullDescription": {"text": "`apps/api/src/routes/social.ts` declares `POST /social/generate/hook-video` 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-ab32d347884ebe7e", "name": "Unused endpoint: POST /social/generate/quote-video", "shortDescription": {"text": "Unused endpoint: POST /social/generate/quote-video"}, "fullDescription": {"text": "`apps/api/src/routes/social.ts` declares `POST /social/generate/quote-video` 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-8b2178e3261ed654", "name": "Unused endpoint: POST /social/generate/loop-video", "shortDescription": {"text": "Unused endpoint: POST /social/generate/loop-video"}, "fullDescription": {"text": "`apps/api/src/routes/social.ts` declares `POST /social/generate/loop-video` 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-f8f3d8aecd30d9dd", "name": "Unused endpoint: GET /articles", "shortDescription": {"text": "Unused endpoint: GET /articles"}, "fullDescription": {"text": "`apps/api/src/routes/articles.ts` declares `GET /articles` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`apps/api/src/routes/admin.ts` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05bda4fdb9422a33", "name": "Unused endpoint: GET /queues.json", "shortDescription": {"text": "Unused endpoint: GET /queues.json"}, "fullDescription": {"text": "`apps/api/src/routes/admin.ts` declares `GET /queues.json` 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-00fee6399c46f4c0", "name": "Unused endpoint: GET /recent-failures.json", "shortDescription": {"text": "Unused endpoint: GET /recent-failures.json"}, "fullDescription": {"text": "`apps/api/src/routes/admin.ts` declares `GET /recent-failures.json` 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-06229c7179a9ec61", "name": "Unused endpoint: GET /pg-stats.json", "shortDescription": {"text": "Unused endpoint: GET /pg-stats.json"}, "fullDescription": {"text": "`apps/api/src/routes/admin.ts` declares `GET /pg-stats.json` 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-84720af82d99ec93", "name": "Unused endpoint: POST /voice/verify", "shortDescription": {"text": "Unused endpoint: POST /voice/verify"}, "fullDescription": {"text": "`apps/api/src/routes/voice.ts` declares `POST /voice/verify` 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-aff3644454917a85", "name": "Unused endpoint: GET /llm-keys", "shortDescription": {"text": "Unused endpoint: GET /llm-keys"}, "fullDescription": {"text": "`apps/api/src/routes/admin-api/llm-keys.ts` declares `GET /llm-keys` 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-18917045b6a1cb0f", "name": "Unused endpoint: POST /llm-keys/migrate", "shortDescription": {"text": "Unused endpoint: POST /llm-keys/migrate"}, "fullDescription": {"text": "`apps/api/src/routes/admin-api/llm-keys.ts` declares `POST /llm-keys/migrate` 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-738ecac73439acba", "name": "Unused endpoint: GET /music", "shortDescription": {"text": "Unused endpoint: GET /music"}, "fullDescription": {"text": "`apps/api/src/routes/admin-api/music.ts` declares `GET /music` 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-5b35bd9f55090e24", "name": "Unused endpoint: POST /music", "shortDescription": {"text": "Unused endpoint: POST /music"}, "fullDescription": {"text": "`apps/api/src/routes/admin-api/music.ts` declares `POST /music` 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-841e50bf821e4158", "name": "Unused endpoint: GET /users", "shortDescription": {"text": "Unused endpoint: GET /users"}, "fullDescription": {"text": "`apps/api/src/routes/admin-api/users.ts` declares `GET /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-01a333a34760fca3", "name": "Unused endpoint: GET /prompts", "shortDescription": {"text": "Unused endpoint: GET /prompts"}, "fullDescription": {"text": "`apps/api/src/routes/admin-api/prompts.ts` declares `GET /prompts` 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-dc4a3dae769cf19c", "name": "Unused endpoint: GET /platform-settings", "shortDescription": {"text": "Unused endpoint: GET /platform-settings"}, "fullDescription": {"text": "`apps/api/src/routes/admin-api/outline-frameworks.ts` declares `GET /platform-settings` 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-a036d47a1a9b85fd", "name": "Unused endpoint: GET /schema-type-rules", "shortDescription": {"text": "Unused endpoint: GET /schema-type-rules"}, "fullDescription": {"text": "`apps/api/src/routes/admin-api/outline-frameworks.ts` declares `GET /schema-type-rules` 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/22132"}, "properties": {"repository": "veitmehler/lever_cast", "repoUrl": "https://github.com/veitmehler/lever_cast", "branch": "main"}, "results": [{"ruleId": "scanner-672081fb9c11b186", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/migrate-user-keys-to-system.ts:91"}, "properties": {"repobilityId": "2343209ca301cee0", "scanner": "scanner-primary", "fingerprint": "672081fb9c11b186", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac4bd719447f0070", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/handlers/oauth.ts:9"}, "properties": {"repobilityId": "95c0b20fc7db39f7", "scanner": "scanner-primary", "fingerprint": "ac4bd719447f0070", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8bd6addcda694a74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ArticleEditor.tsx:191"}, "properties": {"repobilityId": "5206a9977945dac6", "scanner": "scanner-primary", "fingerprint": "8bd6addcda694a74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bb8116dad655b4b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/components/ArticleEditor.tsx:273"}, "properties": {"repobilityId": "c1bc4ba88f9ed849", "scanner": "scanner-primary", "fingerprint": "1bb8116dad655b4b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-eaa07297da112b92", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ImageLibraryPicker.tsx:82"}, "properties": {"repobilityId": "26c91bd1bb4f368e", "scanner": "scanner-primary", "fingerprint": "eaa07297da112b92", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f1a3bb9927bc97f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/settings/route.ts:100"}, "properties": {"repobilityId": "a4a951cc7669c6dc", "scanner": "scanner-primary", "fingerprint": "0f1a3bb9927bc97f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed645777b8098c71", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/posts/route.ts:251"}, "properties": {"repobilityId": "1020dbfda9404f2d", "scanner": "scanner-primary", "fingerprint": "ed645777b8098c71", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18a08710746c1e21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/posts/[id]/sync-analytics/route.ts:64"}, "properties": {"repobilityId": "33ae71feea364904", "scanner": "scanner-primary", "fingerprint": "18a08710746c1e21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-046777fded617770", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/templates/route.ts:8"}, "properties": {"repobilityId": "b72f0c10a8e0b77c", "scanner": "scanner-primary", "fingerprint": "046777fded617770", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-145c6f8274d8b082", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/[platform]/route.ts:144"}, "properties": {"repobilityId": "9c55ccc78e97736a", "scanner": "scanner-primary", "fingerprint": "145c6f8274d8b082", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-49247073709802a4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/[platform]/callback/route.ts:132"}, "properties": {"repobilityId": "9103393620279394", "scanner": "scanner-primary", "fingerprint": "49247073709802a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dbf0eb12a4f1bcfc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/[platform]/pages/route.ts:117"}, "properties": {"repobilityId": "e3d97a27cc06b6a3", "scanner": "scanner-primary", "fingerprint": "dbf0eb12a4f1bcfc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce98804feda6906c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/social/instagram/refresh-username/route.ts:12"}, "properties": {"repobilityId": "39456993b50c958f", "scanner": "scanner-primary", "fingerprint": "ce98804feda6906c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc6a3c05fc306c76", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/settings/wordpress/page.tsx:145"}, "properties": {"repobilityId": "c09d6019ec409e0d", "scanner": "scanner-primary", "fingerprint": "fc6a3c05fc306c76", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-980c40b3cc84e2e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/topics/csv/page.tsx:166"}, "properties": {"repobilityId": "f2fa03be044c7a10", "scanner": "scanner-primary", "fingerprint": "980c40b3cc84e2e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ebccab38f7bda70", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/workflow/page.tsx:267"}, "properties": {"repobilityId": "5d04d12254a58885", "scanner": "scanner-primary", "fingerprint": "7ebccab38f7bda70", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25a93f49787cbb59", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(protected)/images/page.tsx:239"}, "properties": {"repobilityId": "d39922f108683f5e", "scanner": "scanner-primary", "fingerprint": "25a93f49787cbb59", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81ef8d0b2f014d53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/page.tsx:96"}, "properties": {"repobilityId": "50efa0c08d598c01", "scanner": "scanner-primary", "fingerprint": "81ef8d0b2f014d53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b36eb54b8dc0005", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/social/[runId]/page.tsx:225"}, "properties": {"repobilityId": "ffc25c298fb90a16", "scanner": "scanner-primary", "fingerprint": "4b36eb54b8dc0005", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c42c2d9a82f915fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/prompts/[stepNumber]/PromptEditor.tsx:644"}, "properties": {"repobilityId": "aff4d7bb4b1189cb", "scanner": "scanner-primary", "fingerprint": "c42c2d9a82f915fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79756b821cff0277", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/articles/page.tsx:114"}, "properties": {"repobilityId": "4d6a056a5eec6b3c", "scanner": "scanner-primary", "fingerprint": "79756b821cff0277", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7e7e538e47e71ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/articles/[jobId]/page.tsx:82"}, "properties": {"repobilityId": "6a024ac6e890b4f8", "scanner": "scanner-primary", "fingerprint": "c7e7e538e47e71ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d06750c0948050d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/admin/music/page.tsx:173"}, "properties": {"repobilityId": "2ffb690fd8a040b1", "scanner": "scanner-primary", "fingerprint": "8d06750c0948050d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee38188d38cd58cc", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/lib/sanitize-html.ts:4"}, "properties": {"repobilityId": "ecdf134b840e2f19", "scanner": "scanner-primary", "fingerprint": "ee38188d38cd58cc", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8842e0aa24e411df", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/settings/useSocialConnections.ts:49"}, "properties": {"repobilityId": "2973d164b34c6eb8", "scanner": "scanner-primary", "fingerprint": "8842e0aa24e411df", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1d46a8c5bed98d8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/settings/PlatformConnectionRow.tsx:315"}, "properties": {"repobilityId": "0cbed2a5104ccc36", "scanner": "scanner-primary", "fingerprint": "d1d46a8c5bed98d8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb92da821f7327f4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/threads.ts:44"}, "properties": {"repobilityId": "bdfa2a471e1b59e2", "scanner": "scanner-primary", "fingerprint": "eb92da821f7327f4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-571e439ee1aa4208", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/facebook.ts:38"}, "properties": {"repobilityId": "9ff491df4fb085a5", "scanner": "scanner-primary", "fingerprint": "571e439ee1aa4208", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f543c5784e0159cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/linkedin.ts:67"}, "properties": {"repobilityId": "b491b3e27d1af462", "scanner": "scanner-primary", "fingerprint": "f543c5784e0159cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-03c1f696f1c1eed1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/social-callbacks/instagram.ts:41"}, "properties": {"repobilityId": "a886525b670564bf", "scanner": "scanner-primary", "fingerprint": "03c1f696f1c1eed1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20c6e086f7d086bc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/dashboard/useDashboard.ts:119"}, "properties": {"repobilityId": "fc11f337e6514513", "scanner": "scanner-primary", "fingerprint": "20c6e086f7d086bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de57bae9a3b27a9e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/FinalReviewPanel.tsx:42"}, "properties": {"repobilityId": "2d286b55247a67e5", "scanner": "scanner-primary", "fingerprint": "de57bae9a3b27a9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27c74ce0c749df84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/ExportPanel.tsx:107"}, "properties": {"repobilityId": "234107c662b5e699", "scanner": "scanner-primary", "fingerprint": "27c74ce0c749df84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ecf5a842c399cd49", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/SchemaPanel.tsx:37"}, "properties": {"repobilityId": "cf9edeb5b0c91f88", "scanner": "scanner-primary", "fingerprint": "ecf5a842c399cd49", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-878d6ccfd243b6ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/features/workflow/ReviewContentPanel.tsx:46"}, "properties": {"repobilityId": "403c0ffa2ed1b386", "scanner": "scanner-primary", "fingerprint": "878d6ccfd243b6ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f14359617436e5ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/idea-capture/useIdeaCapture.ts:96"}, "properties": {"repobilityId": "e913915f6ebeb389", "scanner": "scanner-primary", "fingerprint": "f14359617436e5ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba4874a9177b21ee", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/features/posts-list/usePostsList.ts:441"}, "properties": {"repobilityId": "2b17ea564bf56e71", "scanner": "scanner-primary", "fingerprint": "ba4874a9177b21ee", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-69f8ac90a781caf7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-images.ts:65"}, "properties": {"repobilityId": "e8232944f38c8a4d", "scanner": "scanner-primary", "fingerprint": "69f8ac90a781caf7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36555d0b9e9b612b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-encryption.ts:107"}, "properties": {"repobilityId": "6e17d6fbb978aec3", "scanner": "scanner-primary", "fingerprint": "36555d0b9e9b612b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-45b51364306be57b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/shared/src/storage.ts:123"}, "properties": {"repobilityId": "9123578431a321a0", "scanner": "scanner-primary", "fingerprint": "45b51364306be57b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-11ca9905b9ca60d9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/shared/src/linkedinApi.ts:295"}, "properties": {"repobilityId": "a18ef7d204666df1", "scanner": "scanner-primary", "fingerprint": "11ca9905b9ca60d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-aae01b2b3dc8cc3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/linkedinApi.ts:64"}, "properties": {"repobilityId": "b5a1e72a68e01f34", "scanner": "scanner-primary", "fingerprint": "aae01b2b3dc8cc3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-28f60f31d6aa0f2e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/encryption.ts:31"}, "properties": {"repobilityId": "0b49e947dc37d816", "scanner": "scanner-primary", "fingerprint": "28f60f31d6aa0f2e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-65d37d3f04d522db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/telegramApi.ts:66"}, "properties": {"repobilityId": "9c61233054053c67", "scanner": "scanner-primary", "fingerprint": "65d37d3f04d522db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c5cc416fa82f8440", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/imageGeneration.ts:228"}, "properties": {"repobilityId": "58d49398ef59b6f2", "scanner": "scanner-primary", "fingerprint": "c5cc416fa82f8440", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6105ced4af0a6778", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/twitterApi.ts:99"}, "properties": {"repobilityId": "2f1dbe5ea541d41f", "scanner": "scanner-primary", "fingerprint": "6105ced4af0a6778", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-27d97f80016641c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/threadsApi.ts:106"}, "properties": {"repobilityId": "52701972e8f88fa6", "scanner": "scanner-primary", "fingerprint": "27d97f80016641c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7bf4553113544431", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/shared/src/instagramUsername.ts:26"}, "properties": {"repobilityId": "388340615fa3c5d1", "scanner": "scanner-primary", "fingerprint": "7bf4553113544431", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-37a41d24f18ae776", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/db/scripts/backfill-media-library.ts:51"}, "properties": {"repobilityId": "45d2ea7fbe0c926d", "scanner": "scanner-primary", "fingerprint": "37a41d24f18ae776", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48247518f3aa5d02", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/db/scripts/seed-max-tokens.ts:52"}, "properties": {"repobilityId": "af8af8b8f62bd121", "scanner": "scanner-primary", "fingerprint": "48247518f3aa5d02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-67c9ae4f1b78286f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/db/scripts/reseed-prompts-v3.ts:1411"}, "properties": {"repobilityId": "d614896ff5c14aa6", "scanner": "scanner-primary", "fingerprint": "67c9ae4f1b78286f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f75e99de95f2d34", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/db/prisma/seed.ts:1620"}, "properties": {"repobilityId": "6b4189bd06c911cd", "scanner": "scanner-primary", "fingerprint": "2f75e99de95f2d34", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dbdf710d06955274", "level": "warning", "message": {"text": "Privileged port 127 in use"}, "properties": {"repobilityId": "afafb77f13b4bf59", "scanner": "scanner-primary", "fingerprint": "dbdf710d06955274", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docker-compose.staging.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5f90eed87916b5d7", "level": "warning", "message": {"text": "Privileged port 20 in use"}, "properties": {"repobilityId": "a59f3e53d617e0f8", "scanner": "scanner-primary", "fingerprint": "5f90eed87916b5d7", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pull-logs.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3d70dcd36b57a39a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "4d458e8b2a501aae", "scanner": "scanner-primary", "fingerprint": "3d70dcd36b57a39a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-3d70dcd36b57a39a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "9a7352a563f35ce7", "scanner": "scanner-primary", "fingerprint": "3d70dcd36b57a39a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 31}}}]}, {"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-ce11df9608afa5ac", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/api/src/article-pipeline/enrichment/svg-renderer.ts:9"}, "properties": {"repobilityId": "abb95816e2809fbb", "scanner": "scanner-primary", "fingerprint": "ce11df9608afa5ac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/article-pipeline/enrichment/svg-renderer.ts"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-b060d0949d934c9a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/api/src/routes/admin.ts:83"}, "properties": {"repobilityId": "ead5e57fbd3bd628", "scanner": "scanner-primary", "fingerprint": "b060d0949d934c9a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/routes/admin.ts"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-bef8944151cda2a5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/api/src/social/video/ffmpeg.ts:1"}, "properties": {"repobilityId": "6be0df61b05d6638", "scanner": "scanner-primary", "fingerprint": "bef8944151cda2a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/social/video/ffmpeg.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5d4611641d8273ff", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/api/src/handlers/backup.ts:2"}, "properties": {"repobilityId": "c404f350ec4ac4a9", "scanner": "scanner-primary", "fingerprint": "5d4611641d8273ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/handlers/backup.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-a85e06d996fcebb4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/components/ArticleEditor.tsx:273"}, "properties": {"repobilityId": "1f7cd822e3915850", "scanner": "scanner-primary", "fingerprint": "a85e06d996fcebb4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/components/ArticleEditor.tsx"}, "region": {"startLine": 273}}}]}, {"ruleId": "scanner-8ee20e61ce5b930f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/ArticleEditor.tsx:55"}, "properties": {"repobilityId": "281f2e3186d7f1ad", "scanner": "scanner-primary", "fingerprint": "8ee20e61ce5b930f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/components/ArticleEditor.tsx"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-cbe33c309bbc13fb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/lib/article-html-islands.ts:42"}, "properties": {"repobilityId": "620683dbe26713de", "scanner": "scanner-primary", "fingerprint": "cbe33c309bbc13fb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/lib/article-html-islands.ts"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-b47deddfe196fb70", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "60a12f01a9bba444", "scanner": "scanner-primary", "fingerprint": "b47deddfe196fb70", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api-staging.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-b47deddfe196fb70", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e76e5c80f1f33923", "scanner": "scanner-primary", "fingerprint": "b47deddfe196fb70", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api-staging.yml"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-b47deddfe196fb70", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "785e4a0d955e3805", "scanner": "scanner-primary", "fingerprint": "b47deddfe196fb70", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api-staging.yml"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-2352406d1940b9e0", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "d0f552d6c5610750", "scanner": "scanner-primary", "fingerprint": "2352406d1940b9e0", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api-staging.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54597edb7f5bad38", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-798cb43a4e14641c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b94ae50231a4fc57", "scanner": "scanner-primary", "fingerprint": "798cb43a4e14641c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pull-logs.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-3cd14d6f45a87d58", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2fbcf71d1c1f0b6f", "scanner": "scanner-primary", "fingerprint": "3cd14d6f45a87d58", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api.yml"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-3cd14d6f45a87d58", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b41f04081ebe57c1", "scanner": "scanner-primary", "fingerprint": "3cd14d6f45a87d58", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-3cd14d6f45a87d58", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "443175159f30a5d5", "scanner": "scanner-primary", "fingerprint": "3cd14d6f45a87d58", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api.yml"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-4bf411a1bee458fb", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "24d7fc6a4b25c421", "scanner": "scanner-primary", "fingerprint": "4bf411a1bee458fb", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a60cfa00ffdc5590", "level": "note", "message": {"text": "Very large file: packages/db/scripts/reseed-prompts-v3.ts (1479 lines)"}, "properties": {"repobilityId": "fc4ed057c3b4acd1", "scanner": "scanner-primary", "fingerprint": "a60cfa00ffdc5590", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f1c86e801e0b0ea3", "level": "note", "message": {"text": "Very large file: packages/db/prisma/seed.ts (1718 lines)"}, "properties": {"repobilityId": "7cdb6f217249f713", "scanner": "scanner-primary", "fingerprint": "f1c86e801e0b0ea3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "5e086ce9f3763da4", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2699d5f16ae11282", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "properties": {"repobilityId": "37ac218a4ef9b430", "scanner": "scanner-primary", "fingerprint": "2699d5f16ae11282", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7b16ae2bd0fca524", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/db/package.json"}, "properties": {"repobilityId": "2bddd295d559a9b6", "scanner": "scanner-primary", "fingerprint": "7b16ae2bd0fca524", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/db/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "daf90b26cd833d8a", "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": "311dda1962754d6e", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "873ee58458ca45ca", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "b9207aa6a1750730", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "88d3fe3636e709b1", "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": "5aa6d5f84dafefc3", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-c5edc2537ef0db30", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/article-pipeline/approval-service.ts:335"}, "properties": {"repobilityId": "cc84e004f5c6944f", "scanner": "scanner-primary", "fingerprint": "c5edc2537ef0db30", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10e524d2b418b6fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/image-uploader.ts:16"}, "properties": {"repobilityId": "f535ccb48576ed8d", "scanner": "scanner-primary", "fingerprint": "10e524d2b418b6fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-077651d3d6340fcf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/citation-validator.ts:129"}, "properties": {"repobilityId": "10d55159f7d6fafd", "scanner": "scanner-primary", "fingerprint": "077651d3d6340fcf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-170df7c6170f62b9", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/article-pipeline/step-runner.ts:196"}, "properties": {"repobilityId": "b65d6db2a16e5e02", "scanner": "scanner-primary", "fingerprint": "170df7c6170f62b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06429025f2d6d237", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/__tests__/citation-validator.test.ts:87"}, "properties": {"repobilityId": "b141ea3834cb9dae", "scanner": "scanner-primary", "fingerprint": "06429025f2d6d237", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9b2517a6de9d409", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/enrichment/wp-category-selector.ts:29"}, "properties": {"repobilityId": "ffb6ed45e21e95da", "scanner": "scanner-primary", "fingerprint": "e9b2517a6de9d409", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-794e990873b3ffde", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/enrichment/wp-tag-selector.ts:30"}, "properties": {"repobilityId": "d8992a4454c3357c", "scanner": "scanner-primary", "fingerprint": "794e990873b3ffde", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0864a8db2cdcf92c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/output/bundle-target.ts:84"}, "properties": {"repobilityId": "91c21335b7dd3b94", "scanner": "scanner-primary", "fingerprint": "0864a8db2cdcf92c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9c6dafc71213a077", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/article-pipeline/output/wordpress-target.ts:78"}, "properties": {"repobilityId": "f53d88855196d95f", "scanner": "scanner-primary", "fingerprint": "9c6dafc71213a077", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6511a6974b1130f2", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in apps/api/src/lib/elevenlabs/client.ts:99"}, "properties": {"repobilityId": "0eb3083108a5354a", "scanner": "scanner-primary", "fingerprint": "6511a6974b1130f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0a01f8b915abf9f3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/elevenlabs/client.ts:90"}, "properties": {"repobilityId": "5cbdb66294d04b38", "scanner": "scanner-primary", "fingerprint": "0a01f8b915abf9f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b83fe8221f7206b8", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in apps/api/src/lib/elevenlabs/settings.ts:29"}, "properties": {"repobilityId": "83e7ee9273ec779f", "scanner": "scanner-primary", "fingerprint": "b83fe8221f7206b8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-86da4c39636597d5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/ai.ts:190"}, "properties": {"repobilityId": "c8b7aac815dd2b61", "scanner": "scanner-primary", "fingerprint": "86da4c39636597d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9d2726c61138b2e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/media.ts:23"}, "properties": {"repobilityId": "6715f47a965728ab", "scanner": "scanner-primary", "fingerprint": "9d2726c61138b2e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-173948dc477593d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/wp-connections.ts:32"}, "properties": {"repobilityId": "372c267845e13769", "scanner": "scanner-primary", "fingerprint": "173948dc477593d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a93ce2317e451f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/articles.ts:70"}, "properties": {"repobilityId": "d9cec1ac186ca510", "scanner": "scanner-primary", "fingerprint": "3a93ce2317e451f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bee4496b437864a2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/admin.ts:76"}, "properties": {"repobilityId": "11bd74a75810f82c", "scanner": "scanner-primary", "fingerprint": "bee4496b437864a2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a9c3fe2345aba8ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/social/generate-video-assets.ts:534"}, "properties": {"repobilityId": "562379595a807ccc", "scanner": "scanner-primary", "fingerprint": "a9c3fe2345aba8ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-09ebc6f5cf5552a8", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/social/compositors/carousel.ts:76"}, "properties": {"repobilityId": "9353b9ae82c2a2ae", "scanner": "scanner-primary", "fingerprint": "09ebc6f5cf5552a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f822628c69b6d899", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/social/compositors/carousel.ts:216"}, "properties": {"repobilityId": "063e9d4138b7b2d0", "scanner": "scanner-primary", "fingerprint": "f822628c69b6d899", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-829bf752a0cccb5a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/queues/index.ts:31"}, "properties": {"repobilityId": "e791ff00d423cedc", "scanner": "scanner-primary", "fingerprint": "829bf752a0cccb5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80e39492f54894b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/middleware.ts:63"}, "properties": {"repobilityId": "244d02ca9eaa125e", "scanner": "scanner-primary", "fingerprint": "80e39492f54894b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d980e049c82bfbbe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/ai/models/[provider]/route.ts:212"}, "properties": {"repobilityId": "c0fc83034f4cd0c4", "scanner": "scanner-primary", "fingerprint": "d980e049c82bfbbe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-391b125397d2cb4e", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/app/api/social/[platform]/route.ts:45"}, "properties": {"repobilityId": "e9791948b44f7d85", "scanner": "scanner-primary", "fingerprint": "391b125397d2cb4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aef48d13c354f6a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/social/[platform]/pages/route.ts:162"}, "properties": {"repobilityId": "283a70e038f75a18", "scanner": "scanner-primary", "fingerprint": "aef48d13c354f6a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3942c3af62b2b83a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/app/api/articles/[jobId]/events/route.ts:13"}, "properties": {"repobilityId": "da9bc492732a1e8f", "scanner": "scanner-primary", "fingerprint": "3942c3af62b2b83a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b26183e32adaad1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/articles/[jobId]/events/route.ts:31"}, "properties": {"repobilityId": "27191098d1123c13", "scanner": "scanner-primary", "fingerprint": "8b26183e32adaad1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c84395b9594bb70e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/settings/wordpress/page.tsx:61"}, "properties": {"repobilityId": "e65a067dd38fcbe3", "scanner": "scanner-primary", "fingerprint": "c84395b9594bb70e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5bf11f2c31af06b4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/templates/page.tsx:202"}, "properties": {"repobilityId": "e93eae7f1fde2ac3", "scanner": "scanner-primary", "fingerprint": "5bf11f2c31af06b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-371c56b865cb9ad2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/workflow/[jobId]/preview/page.tsx:22"}, "properties": {"repobilityId": "4eee57b059a40a2a", "scanner": "scanner-primary", "fingerprint": "371c56b865cb9ad2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-26388d2960cb6d16", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/account/page.tsx:22"}, "properties": {"repobilityId": "371582f3d8101fdc", "scanner": "scanner-primary", "fingerprint": "26388d2960cb6d16", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-890f4b5adfd98118", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(protected)/images/page.tsx:94"}, "properties": {"repobilityId": "edc83c825958733c", "scanner": "scanner-primary", "fingerprint": "890f4b5adfd98118", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4bb7a052cb40a6be", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/lib/api-proxy.ts:28"}, "properties": {"repobilityId": "54d0203facb07cf8", "scanner": "scanner-primary", "fingerprint": "4bb7a052cb40a6be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91a952ad5aa91e16", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/use-authed-fetch.ts:44"}, "properties": {"repobilityId": "6512b5840d61892c", "scanner": "scanner-primary", "fingerprint": "91a952ad5aa91e16", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ae92b250d8574c4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/mockAI.ts:55"}, "properties": {"repobilityId": "e1a1e500d73945bf", "scanner": "scanner-primary", "fingerprint": "3ae92b250d8574c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f6e462280315e8d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/settings/PlatformConnectionRow.tsx:61"}, "properties": {"repobilityId": "9252420b9e2ef084", "scanner": "scanner-primary", "fingerprint": "8f6e462280315e8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a827769cc7f4f36a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/threads.ts:20"}, "properties": {"repobilityId": "75d19fcd5105449f", "scanner": "scanner-primary", "fingerprint": "a827769cc7f4f36a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8e9709f7cb67ce8f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/facebook.ts:45"}, "properties": {"repobilityId": "40d4697d4345b758", "scanner": "scanner-primary", "fingerprint": "8e9709f7cb67ce8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3250cf23af923ebc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/linkedin.ts:39"}, "properties": {"repobilityId": "7e8e73ff10e58387", "scanner": "scanner-primary", "fingerprint": "3250cf23af923ebc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-02cfd9b9cdad5ce4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/twitter.ts:28"}, "properties": {"repobilityId": "bb65a502a7f9f190", "scanner": "scanner-primary", "fingerprint": "02cfd9b9cdad5ce4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aed5aa2f5fd6511e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/social-callbacks/instagram.ts:48"}, "properties": {"repobilityId": "c871bc9cb0244757", "scanner": "scanner-primary", "fingerprint": "aed5aa2f5fd6511e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8903b170bac1c9e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/dashboard/useDashboard.ts:144"}, "properties": {"repobilityId": "b0b7daddfd8e3d28", "scanner": "scanner-primary", "fingerprint": "a8903b170bac1c9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb4635e6380f8c16", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/features/workflow/useWorkflowJob.ts:203"}, "properties": {"repobilityId": "51f7576f22d69654", "scanner": "scanner-primary", "fingerprint": "cb4635e6380f8c16", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6cce6ce37e63fae", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/workflow/useWorkflowJob.ts:33"}, "properties": {"repobilityId": "489069ea199c1d32", "scanner": "scanner-primary", "fingerprint": "c6cce6ce37e63fae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-15e628d843c36253", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/features/social/draftContent.ts:1"}, "properties": {"repobilityId": "d12f6ff96defa5a1", "scanner": "scanner-primary", "fingerprint": "15e628d843c36253", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e4f0e07c65fa035", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/features/idea-capture/useIdeaCapture.ts:35"}, "properties": {"repobilityId": "ac01f6edf0d43c36", "scanner": "scanner-primary", "fingerprint": "2e4f0e07c65fa035", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b109b30210672d55", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/idea-capture/useIdeaCapture.ts:64"}, "properties": {"repobilityId": "a2fe40aa7f954935", "scanner": "scanner-primary", "fingerprint": "b109b30210672d55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-db8535fb395aa462", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/post-editor/usePostEditor.ts:129"}, "properties": {"repobilityId": "ee175fe7641b629b", "scanner": "scanner-primary", "fingerprint": "db8535fb395aa462", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2094fac1a802ae70", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/features/posts-list/usePostsList.ts:240"}, "properties": {"repobilityId": "1619c2112b0c5ebe", "scanner": "scanner-primary", "fingerprint": "2094fac1a802ae70", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f2769a733208dfb9", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared/src/socialConnections.ts:78"}, "properties": {"repobilityId": "a53351a97580ac24", "scanner": "scanner-primary", "fingerprint": "f2769a733208dfb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd688632063aa285", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/storage.ts:240"}, "properties": {"repobilityId": "31410f4026aba6d6", "scanner": "scanner-primary", "fingerprint": "dd688632063aa285", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8a15a9af4d67584", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/linkedinApi.ts:78"}, "properties": {"repobilityId": "f46a0ddece8a3488", "scanner": "scanner-primary", "fingerprint": "a8a15a9af4d67584", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7516f0e8b9e34e17", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/telegramApi.ts:157"}, "properties": {"repobilityId": "39c59f9fd2c348ce", "scanner": "scanner-primary", "fingerprint": "7516f0e8b9e34e17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f4dbb14d5a4fa97", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/imageGeneration.ts:121"}, "properties": {"repobilityId": "73e26277b88ba806", "scanner": "scanner-primary", "fingerprint": "9f4dbb14d5a4fa97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-02bdb82c60fa1b9a", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/shared/src/twitterApi.ts:940"}, "properties": {"repobilityId": "4218cc83e69e89aa", "scanner": "scanner-primary", "fingerprint": "02bdb82c60fa1b9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-733280577bbb5247", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/twitterApi.ts:74"}, "properties": {"repobilityId": "b807fe148d424ca4", "scanner": "scanner-primary", "fingerprint": "733280577bbb5247", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a36034f42c6ee904", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/threadsApi.ts:125"}, "properties": {"repobilityId": "2c094b74003a21f1", "scanner": "scanner-primary", "fingerprint": "a36034f42c6ee904", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-640ff067341f87f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/src/instagramUsername.ts:31"}, "properties": {"repobilityId": "87e4bd167c275fb0", "scanner": "scanner-primary", "fingerprint": "640ff067341f87f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-80f60bf20493c348", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared/src/prisma.ts:3"}, "properties": {"repobilityId": "3fcdfe44f317c588", "scanner": "scanner-primary", "fingerprint": "80f60bf20493c348", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7500124bd915c483", "level": "error", "message": {"text": "Dangling fetch: POST https://realtime.oxylabs.io/v1/queries (apps/api/src/article-pipeline/citation-validator.ts:129)"}, "properties": {"repobilityId": "8e2680405c4fa304", "scanner": "scanner-primary", "fingerprint": "7500124bd915c483", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4fe11b391bac2bc0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (apps/api/src/lib/alerts.ts:51)"}, "properties": {"repobilityId": "6f5777ed470c6ca0", "scanner": "scanner-primary", "fingerprint": "4fe11b391bac2bc0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7ff4e1e1e3556e60", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/routes/ai.ts:190)"}, "properties": {"repobilityId": "872d01df25a4289e", "scanner": "scanner-primary", "fingerprint": "7ff4e1e1e3556e60", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd00051961b96442", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (apps/api/src/routes/ai.ts:525)"}, "properties": {"repobilityId": "7c3a4f83c254bb93", "scanner": "scanner-primary", "fingerprint": "fd00051961b96442", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6456b2530d387335", "level": "error", "message": {"text": "Dangling fetch: GET /admin/queues.json (apps/api/src/routes/admin.ts:76)"}, "properties": {"repobilityId": "c12456ebc2b6882f", "scanner": "scanner-primary", "fingerprint": "6456b2530d387335", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6706b77805a22e5e", "level": "error", "message": {"text": "Dangling fetch: GET /admin/pg-stats.json (apps/api/src/routes/admin.ts:77)"}, "properties": {"repobilityId": "a17e10f96e381643", "scanner": "scanner-primary", "fingerprint": "6706b77805a22e5e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc1c313d78c08669", "level": "error", "message": {"text": "Dangling fetch: GET /admin/recent-failures.json (apps/api/src/routes/admin.ts:78)"}, "properties": {"repobilityId": "1eefdb3045833c82", "scanner": "scanner-primary", "fingerprint": "dc1c313d78c08669", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc871551b5b38139", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts/${postId}/sync-analytics (apps/web/src/components/PostAnalytics.tsx:45)"}, "properties": {"repobilityId": "e9f8e9156e3b9e14", "scanner": "scanner-primary", "fingerprint": "dc871551b5b38139", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-08d9f3ca3d0fa41b", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/articles/${jobId}/content (apps/web/src/components/ArticleEditor.tsx:164)"}, "properties": {"repobilityId": "7345d8d8b941ded6", "scanner": "scanner-primary", "fingerprint": "08d9f3ca3d0fa41b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d26aae65854e5bb", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (apps/web/src/components/ImageGenerationModal.tsx:151)"}, "properties": {"repobilityId": "71e7127db6cc49c2", "scanner": "scanner-primary", "fingerprint": "7d26aae65854e5bb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-374f560cf220e581", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/components/ImageGenerationModal.tsx:205)"}, "properties": {"repobilityId": "766dfdfa6690b005", "scanner": "scanner-primary", "fingerprint": "374f560cf220e581", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ff9cca95446eef0", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai/models/${provider} (apps/web/src/components/ImageGenerationModal.tsx:224)"}, "properties": {"repobilityId": "30d45f5c7cfa7d3c", "scanner": "scanner-primary", "fingerprint": "4ff9cca95446eef0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c8bec93e5d2b06cf", "level": "error", "message": {"text": "Dangling fetch: GET /api/api-keys (apps/web/src/components/ImageGenerationModal.tsx:243)"}, "properties": {"repobilityId": "43bae95fb961f334", "scanner": "scanner-primary", "fingerprint": "c8bec93e5d2b06cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-75d8a3bfa8552fdf", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai/models/${llmProvider} (apps/web/src/components/ImageGenerationModal.tsx:275)"}, "properties": {"repobilityId": "a56200b88d968942", "scanner": "scanner-primary", "fingerprint": "75d8a3bfa8552fdf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c111fd0d4ca68961", "level": "error", "message": {"text": "Dangling fetch: POST /api/images/generate-prompt (apps/web/src/components/ImageGenerationModal.tsx:302)"}, "properties": {"repobilityId": "79d94bf268d0f0f9", "scanner": "scanner-primary", "fingerprint": "c111fd0d4ca68961", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e197eb544c322efb", "level": "error", "message": {"text": "Dangling fetch: POST /api/images/generate (apps/web/src/components/ImageGenerationModal.tsx:355)"}, "properties": {"repobilityId": "2a443f1df8323b46", "scanner": "scanner-primary", "fingerprint": "e197eb544c322efb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b5a03391c54a5e4e", "level": "error", "message": {"text": "Dangling fetch: POST /api/social-automation/${runId}/retry/${slotKey} (apps/web/src/components/CalendarDayView.tsx:62)"}, "properties": {"repobilityId": "4175461ead0aac9b", "scanner": "scanner-primary", "fingerprint": "b5a03391c54a5e4e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f806661b2757bcd9", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (apps/web/src/components/Sidebar.tsx:49)"}, "properties": {"repobilityId": "fad0260ba48debcd", "scanner": "scanner-primary", "fingerprint": "f806661b2757bcd9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-250241329f982ed2", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/sync-user (apps/web/src/components/Sidebar.tsx:74)"}, "properties": {"repobilityId": "db5036503e86ae3f", "scanner": "scanner-primary", "fingerprint": "250241329f982ed2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-74ab36844f5d5421", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/components/Sidebar.tsx:107)"}, "properties": {"repobilityId": "72b5b6319d40e0ea", "scanner": "scanner-primary", "fingerprint": "74ab36844f5d5421", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-13f320de6683b5e0", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (apps/web/src/components/ThemeProvider.tsx:23)"}, "properties": {"repobilityId": "b702b89c087442e4", "scanner": "scanner-primary", "fingerprint": "13f320de6683b5e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65da432b4cd5fba6", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/components/ThemeProvider.tsx:63)"}, "properties": {"repobilityId": "4610520a3d2ecab2", "scanner": "scanner-primary", "fingerprint": "65da432b4cd5fba6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b2a1c3ec290a318e", "level": "error", "message": {"text": "Dangling fetch: GET https://api.anthropic.com/v1/models (apps/web/src/app/api/ai/models/[provider]/route.ts:130)"}, "properties": {"repobilityId": "951ea0db639f691c", "scanner": "scanner-primary", "fingerprint": "b2a1c3ec290a318e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c19a30f6ae9cf329", "level": "error", "message": {"text": "Dangling fetch: GET https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey} (apps/web/src/app/api/ai/models/[provider]/route.ts:172)"}, "properties": {"repobilityId": "cb0a1fe37ee0e80a", "scanner": "scanner-primary", "fingerprint": "c19a30f6ae9cf329", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f0c24718011f7f92", "level": "error", "message": {"text": "Dangling fetch: GET https://openrouter.ai/api/v1/models (apps/web/src/app/api/ai/models/[provider]/route.ts:212)"}, "properties": {"repobilityId": "8ec9ff4599152960", "scanner": "scanner-primary", "fingerprint": "f0c24718011f7f92", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-05951becd1f35418", "level": "error", "message": {"text": "Dangling fetch: GET https://api.replicate.com/v1/models (apps/web/src/app/api/ai/models/[provider]/route.ts:280)"}, "properties": {"repobilityId": "ed86f5e243efb7b9", "scanner": "scanner-primary", "fingerprint": "05951becd1f35418", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d57d9ffd45fab8d", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/wp/connections/${id} (apps/web/src/app/(protected)/settings/wordpress/page.tsx:50)"}, "properties": {"repobilityId": "d7359e3c039ba743", "scanner": "scanner-primary", "fingerprint": "2d57d9ffd45fab8d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e7791ca3c2ac70c", "level": "error", "message": {"text": "Dangling fetch: POST /api/wp/connections/${id}/verify (apps/web/src/app/(protected)/settings/wordpress/page.tsx:61)"}, "properties": {"repobilityId": "75df6482fd0db6fa", "scanner": "scanner-primary", "fingerprint": "2e7791ca3c2ac70c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7782d7236e804341", "level": "error", "message": {"text": "Dangling fetch: GET /api/templates (apps/web/src/app/(protected)/templates/page.tsx:39)"}, "properties": {"repobilityId": "f6aa812f8263f024", "scanner": "scanner-primary", "fingerprint": "7782d7236e804341", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd74d46e5d9928e3", "level": "error", "message": {"text": "Dangling fetch: GET /api/templates/${templateId} (apps/web/src/app/(protected)/templates/page.tsx:63)"}, "properties": {"repobilityId": "d4f714061118078f", "scanner": "scanner-primary", "fingerprint": "fd74d46e5d9928e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-672975086726e277", "level": "error", "message": {"text": "Dangling fetch: POST /api/templates/seed (apps/web/src/app/(protected)/templates/page.tsx:76)"}, "properties": {"repobilityId": "2f5e5612461fede0", "scanner": "scanner-primary", "fingerprint": "672975086726e277", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-562ba495f9e3275c", "level": "error", "message": {"text": "Dangling fetch: POST /api/templates/update-platforms (apps/web/src/app/(protected)/templates/page.tsx:92)"}, "properties": {"repobilityId": "70d77c46162eba00", "scanner": "scanner-primary", "fingerprint": "562ba495f9e3275c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4c2f3ba01419d69b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/templates/${id} (apps/web/src/app/(protected)/templates/page.tsx:118)"}, "properties": {"repobilityId": "87a618daa96f1826", "scanner": "scanner-primary", "fingerprint": "4c2f3ba01419d69b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-79724d977216d3e6", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/templates/${id} (apps/web/src/app/(protected)/templates/page.tsx:138)"}, "properties": {"repobilityId": "16ad9a473d018917", "scanner": "scanner-primary", "fingerprint": "79724d977216d3e6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-44bee6057f9b354f", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/templates/${editingTemplate.id} (apps/web/src/app/(protected)/templates/page.tsx:188)"}, "properties": {"repobilityId": "b445b65afce2f0a5", "scanner": "scanner-primary", "fingerprint": "44bee6057f9b354f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-756c331f27aa9600", "level": "error", "message": {"text": "Dangling fetch: POST /api/templates (apps/web/src/app/(protected)/templates/page.tsx:202)"}, "properties": {"repobilityId": "6b437fa0dee2151b", "scanner": "scanner-primary", "fingerprint": "756c331f27aa9600", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f73e44ceb972c11", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts (apps/web/src/app/(protected)/account/page.tsx:21)"}, "properties": {"repobilityId": "de16cc03937582cf", "scanner": "scanner-primary", "fingerprint": "4f73e44ceb972c11", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84938cb6cd422f61", "level": "error", "message": {"text": "Dangling fetch: GET /api/posts (apps/web/src/app/(protected)/account/page.tsx:22)"}, "properties": {"repobilityId": "1aef17190085defa", "scanner": "scanner-primary", "fingerprint": "84938cb6cd422f61", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa416d52d913fd79", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/media/${item.id} (apps/web/src/app/(protected)/images/page.tsx:118)"}, "properties": {"repobilityId": "4b41dec215d4d916", "scanner": "scanner-primary", "fingerprint": "fa416d52d913fd79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc247d5561a64d2e", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/users/${userId} (apps/web/src/app/admin/users/RoleToggle.tsx:19)"}, "properties": {"repobilityId": "8ad3683a26b81146", "scanner": "scanner-primary", "fingerprint": "dc247d5561a64d2e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-156cbfc63ec14479", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/errors/${errorId} (apps/web/src/app/admin/errors/ResolveButton.tsx:16)"}, "properties": {"repobilityId": "fd7d10bfa1a903df", "scanner": "scanner-primary", "fingerprint": "156cbfc63ec14479", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8cc375eea9757113", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/schema-type-rules (apps/web/src/app/admin/schema-rules/page.tsx:25)"}, "properties": {"repobilityId": "1fd6437e26423af1", "scanner": "scanner-primary", "fingerprint": "8cc375eea9757113", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6dc75844152a31c4", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/schema-type-rules (apps/web/src/app/admin/schema-rules/page.tsx:56)"}, "properties": {"repobilityId": "d7f3c59d8dbde755", "scanner": "scanner-primary", "fingerprint": "6dc75844152a31c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6cd365a5923041e0", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/prompts (apps/web/src/app/admin/prompts/page.tsx:138)"}, "properties": {"repobilityId": "188591f168aed201", "scanner": "scanner-primary", "fingerprint": "6cd365a5923041e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ce2a9cb304972c52", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/prompts/${template.stepNumber} (apps/web/src/app/admin/prompts/[stepNumber]/PromptEditor.tsx:322)"}, "properties": {"repobilityId": "d2676c3f34f49430", "scanner": "scanner-primary", "fingerprint": "ce2a9cb304972c52", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d5d2178d8ce15486", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/prompts/${stepNumber} (apps/web/src/app/admin/prompts/[stepNumber]/page.tsx:39)"}, "properties": {"repobilityId": "e8cec297b85bfb83", "scanner": "scanner-primary", "fingerprint": "d5d2178d8ce15486", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-02e7a472cd032ca9", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/outline-frameworks/${framework.number} (apps/web/src/app/admin/outline-frameworks/page.tsx:72)"}, "properties": {"repobilityId": "6c5de3d8ee7403ce", "scanner": "scanner-primary", "fingerprint": "02e7a472cd032ca9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-13e6741efbdc6803", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/platform-settings (apps/web/src/app/admin/outline-frameworks/page.tsx:220)"}, "properties": {"repobilityId": "fc22836cba9d1f13", "scanner": "scanner-primary", "fingerprint": "13e6741efbdc6803", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4c71ae26b5a35e90", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/outline-frameworks (apps/web/src/app/admin/outline-frameworks/page.tsx:298)"}, "properties": {"repobilityId": "b3937cc519813e6d", "scanner": "scanner-primary", "fingerprint": "4c71ae26b5a35e90", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b34208f73d86653b", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/platform-settings (apps/web/src/app/admin/outline-frameworks/page.tsx:299)"}, "properties": {"repobilityId": "48ddc7317436dfef", "scanner": "scanner-primary", "fingerprint": "b34208f73d86653b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ddf7036e8c90e970", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/music (apps/web/src/app/admin/music/page.tsx:32)"}, "properties": {"repobilityId": "adc4b2eeec9b7c1f", "scanner": "scanner-primary", "fingerprint": "ddf7036e8c90e970", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-47af2c60f105d07b", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/music (apps/web/src/app/admin/music/page.tsx:63)"}, "properties": {"repobilityId": "e2705915820e9414", "scanner": "scanner-primary", "fingerprint": "47af2c60f105d07b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9f6bf0e226ccc0b3", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/music/${track.id} (apps/web/src/app/admin/music/page.tsx:86)"}, "properties": {"repobilityId": "a750e18dcc6849d2", "scanner": "scanner-primary", "fingerprint": "9f6bf0e226ccc0b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4fa1778df541da57", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/music/${track.id} (apps/web/src/app/admin/music/page.tsx:106)"}, "properties": {"repobilityId": "9693ec370e181ec9", "scanner": "scanner-primary", "fingerprint": "4fa1778df541da57", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d464d9013c0495b7", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/llm-keys (apps/web/src/app/admin/llm/page.tsx:34)"}, "properties": {"repobilityId": "7254a613dafbe8b6", "scanner": "scanner-primary", "fingerprint": "d464d9013c0495b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9d374d8da3f410d", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/llm-keys/${provider} (apps/web/src/app/admin/llm/page.tsx:53)"}, "properties": {"repobilityId": "4fafb8ad55e904c0", "scanner": "scanner-primary", "fingerprint": "b9d374d8da3f410d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc7388d5db173c8e", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/llm-keys/migrate (apps/web/src/app/admin/llm/page.tsx:72)"}, "properties": {"repobilityId": "46cdf9ff70c1c593", "scanner": "scanner-primary", "fingerprint": "bc7388d5db173c8e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0eb38bc6e33ef938", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/generate (apps/web/src/lib/mockAI.ts:55)"}, "properties": {"repobilityId": "cc82dee4cd27d5e4", "scanner": "scanner-primary", "fingerprint": "0eb38bc6e33ef938", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b19aea147dda3e32", "level": "error", "message": {"text": "Dangling fetch: GET /api/social/${platform}/pages (apps/web/src/features/settings/useSocialConnections.ts:67)"}, "properties": {"repobilityId": "b73a03a40399de8a", "scanner": "scanner-primary", "fingerprint": "b19aea147dda3e32", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-88348c909f581d87", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/social/${platform}/settings (apps/web/src/features/settings/useSocialConnections.ts:158)"}, "properties": {"repobilityId": "dbe45346c603d031", "scanner": "scanner-primary", "fingerprint": "88348c909f581d87", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c5b5963da196dc2", "level": "error", "message": {"text": "Dangling fetch: GET /api/social/connections (apps/web/src/features/settings/useSocialConnections.ts:193)"}, "properties": {"repobilityId": "b6ab2b67b36adb37", "scanner": "scanner-primary", "fingerprint": "5c5b5963da196dc2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-61d4569de12d7b87", "level": "error", "message": {"text": "Dangling fetch: POST /api/api-keys (apps/web/src/features/settings/TelegramRow.tsx:36)"}, "properties": {"repobilityId": "a8d8cfe8178d796d", "scanner": "scanner-primary", "fingerprint": "61d4569de12d7b87", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e555cf2699f1978", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/api-keys (apps/web/src/features/settings/TelegramRow.tsx:69)"}, "properties": {"repobilityId": "77b2eeafcf489061", "scanner": "scanner-primary", "fingerprint": "8e555cf2699f1978", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c2a8af9f143e7e1e", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/features/settings/TelegramRow.tsx:152)"}, "properties": {"repobilityId": "28787fa810832871", "scanner": "scanner-primary", "fingerprint": "c2a8af9f143e7e1e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e0f52dde7d18844a", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/social/${platform} (apps/web/src/features/settings/PlatformConnectionRow.tsx:103)"}, "properties": {"repobilityId": "dbcfb5ac5c20cdc7", "scanner": "scanner-primary", "fingerprint": "e0f52dde7d18844a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3a1789416232f3ca", "level": "error", "message": {"text": "Dangling fetch: POST /api/social/instagram/refresh-username (apps/web/src/features/settings/PlatformConnectionRow.tsx:225)"}, "properties": {"repobilityId": "f7330574528e5e4d", "scanner": "scanner-primary", "fingerprint": "3a1789416232f3ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7bc5b34223e0e8fe", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (apps/web/src/features/settings/useSettingsData.ts:91)"}, "properties": {"repobilityId": "eaec36c34c32a919", "scanner": "scanner-primary", "fingerprint": "7bc5b34223e0e8fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-23795405147c35a9", "level": "error", "message": {"text": "Dangling fetch: GET /api/api-keys (apps/web/src/features/settings/useSettingsData.ts:92)"}, "properties": {"repobilityId": "4aa599952d8c9ec9", "scanner": "scanner-primary", "fingerprint": "23795405147c35a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b2c374684e8ba699", "level": "error", "message": {"text": "Dangling fetch: GET /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:93)"}, "properties": {"repobilityId": "96067ef8c3a7639d", "scanner": "scanner-primary", "fingerprint": "b2c374684e8ba699", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-20e92699915fbdca", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/settings (apps/web/src/features/settings/useSettingsData.ts:165)"}, "properties": {"repobilityId": "da74aa9c97bd907a", "scanner": "scanner-primary", "fingerprint": "20e92699915fbdca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d6ddf49fdf5ef2ce", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/analyze-writing-style (apps/web/src/features/settings/useSettingsData.ts:198)"}, "properties": {"repobilityId": "f26dee18e83350db", "scanner": "scanner-primary", "fingerprint": "d6ddf49fdf5ef2ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-24b472173fc82a13", "level": "error", "message": {"text": "Dangling fetch: POST /api/brand-settings/logo (apps/web/src/features/settings/useSettingsData.ts:247)"}, "properties": {"repobilityId": "49e0447b4b809f75", "scanner": "scanner-primary", "fingerprint": "24b472173fc82a13", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5a43c377d4003737", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/brand-settings/logo (apps/web/src/features/settings/useSettingsData.ts:261)"}, "properties": {"repobilityId": "529da08b5682b293", "scanner": "scanner-primary", "fingerprint": "5a43c377d4003737", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8456b3cfc4a9bda1", "level": "error", "message": {"text": "Dangling fetch: POST /api/brand-settings/social-logo (apps/web/src/features/settings/useSettingsData.ts:289)"}, "properties": {"repobilityId": "3f58fe70fe181e0e", "scanner": "scanner-primary", "fingerprint": "8456b3cfc4a9bda1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5097af1bb8f33c0f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/brand-settings/social-logo (apps/web/src/features/settings/useSettingsData.ts:303)"}, "properties": {"repobilityId": "56938c939aaf68fb", "scanner": "scanner-primary", "fingerprint": "5097af1bb8f33c0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-929cdec85b43835a", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:315)"}, "properties": {"repobilityId": "d4bf40c8b5378aa4", "scanner": "scanner-primary", "fingerprint": "929cdec85b43835a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-baefb202e3326a36", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:373)"}, "properties": {"repobilityId": "ea3ba66505a435e6", "scanner": "scanner-primary", "fingerprint": "baefb202e3326a36", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-19c4594428ba2823", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/brand-settings (apps/web/src/features/settings/useSettingsData.ts:399)"}, "properties": {"repobilityId": "3a079cb7998a06b0", "scanner": "scanner-primary", "fingerprint": "19c4594428ba2823", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c68d696a05cec797", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.threads.net/oauth/access_token (apps/web/src/features/social-callbacks/threads.ts:20)"}, "properties": {"repobilityId": "76f1912799ca03fb", "scanner": "scanner-primary", "fingerprint": "c68d696a05cec797", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07380ae1a9d41979", "level": "error", "message": {"text": "Dangling fetch: POST https://www.linkedin.com/oauth/v2/accessToken (apps/web/src/features/social-callbacks/linkedin.ts:39)"}, "properties": {"repobilityId": "78936476a16963a7", "scanner": "scanner-primary", "fingerprint": "07380ae1a9d41979", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b4cdcd1af5f0f98e", "level": "error", "message": {"text": "Dangling fetch: GET https://api.linkedin.com/v2/userinfo (apps/web/src/features/social-callbacks/linkedin.ts:90)"}, "properties": {"repobilityId": "4721a32e32a80862", "scanner": "scanner-primary", "fingerprint": "b4cdcd1af5f0f98e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-24e81f01ec21121f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twitter.com/2/oauth2/token (apps/web/src/features/social-callbacks/twitter.ts:28)"}, "properties": {"repobilityId": "c55318a9e1c5b92a", "scanner": "scanner-primary", "fingerprint": "24e81f01ec21121f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-850c80a0dfcb1191", "level": "error", "message": {"text": "Dangling fetch: GET https://api.twitter.com/2/users/me?user.fields=username,name (apps/web/src/features/social-callbacks/twitter.ts:57)"}, "properties": {"repobilityId": "70ee55ae62b15584", "scanner": "scanner-primary", "fingerprint": "850c80a0dfcb1191", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cbd23299b31104e4", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${currentDraftId} (apps/web/src/features/dashboard/useDashboard.ts:144)"}, "properties": {"repobilityId": "b8d23c02019c5792", "scanner": "scanner-primary", "fingerprint": "cbd23299b31104e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a149c5209026465f", "level": "error", "message": {"text": "Dangling fetch: POST /api/drafts (apps/web/src/features/dashboard/useDashboard.ts:174)"}, "properties": {"repobilityId": "a3b8386e60d9a041", "scanner": "scanner-primary", "fingerprint": "a149c5209026465f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a16202e9648e4956", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${currentDraftId} (apps/web/src/features/dashboard/useDashboard.ts:270)"}, "properties": {"repobilityId": "bab7b336dc5955f3", "scanner": "scanner-primary", "fingerprint": "a16202e9648e4956", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b96dff8c2dae516b", "level": "error", "message": {"text": "Dangling fetch: POST /api/drafts (apps/web/src/features/dashboard/useDashboard.ts:326)"}, "properties": {"repobilityId": "368686e4eae40e28", "scanner": "scanner-primary", "fingerprint": "b96dff8c2dae516b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d9fc5ae49fca0ea2", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${draftId} (apps/web/src/features/dashboard/useDashboard.ts:393)"}, "properties": {"repobilityId": "9de46ef09435e39e", "scanner": "scanner-primary", "fingerprint": "d9fc5ae49fca0ea2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1529e570f5c49d87", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:408)"}, "properties": {"repobilityId": "f331a812a2a23b28", "scanner": "scanner-primary", "fingerprint": "1529e570f5c49d87", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-71dd47119a1c93af", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:439)"}, "properties": {"repobilityId": "495b3496e4d4b1a3", "scanner": "scanner-primary", "fingerprint": "71dd47119a1c93af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-09628ad038ecb0a1", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:466)"}, "properties": {"repobilityId": "0dee1ca3dae6b276", "scanner": "scanner-primary", "fingerprint": "09628ad038ecb0a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3448a9e79558d402", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${draftId} (apps/web/src/features/dashboard/useDashboard.ts:529)"}, "properties": {"repobilityId": "ed4493710b8063c5", "scanner": "scanner-primary", "fingerprint": "3448a9e79558d402", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad24f353fc174337", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (apps/web/src/features/dashboard/useDashboard.ts:543)"}, "properties": {"repobilityId": "eb840778d880615a", "scanner": "scanner-primary", "fingerprint": "ad24f353fc174337", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21d7343372f61fd2", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts/publish (apps/web/src/features/dashboard/useDashboard.ts:581)"}, "properties": {"repobilityId": "afa2f00b0b873d74", "scanner": "scanner-primary", "fingerprint": "21d7343372f61fd2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-70ddfb6011b20774", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:607)"}, "properties": {"repobilityId": "36a512c5a90ace35", "scanner": "scanner-primary", "fingerprint": "70ddfb6011b20774", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b906bbbc075701d2", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:643)"}, "properties": {"repobilityId": "9c78408d3a4e40cd", "scanner": "scanner-primary", "fingerprint": "b906bbbc075701d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4586fdfb63944912", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/dashboard/useDashboard.ts:677)"}, "properties": {"repobilityId": "0d37952a220c1cb6", "scanner": "scanner-primary", "fingerprint": "4586fdfb63944912", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-43eaac9843438681", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts/${draftId} (apps/web/src/features/dashboard/useDashboard.ts:712)"}, "properties": {"repobilityId": "15f2a5b28a5caaf0", "scanner": "scanner-primary", "fingerprint": "43eaac9843438681", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c040cdb6b2ff059", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${currentDraftId} (apps/web/src/features/dashboard/sections/DashboardInput.tsx:67)"}, "properties": {"repobilityId": "c7745c75f3c75d3d", "scanner": "scanner-primary", "fingerprint": "0c040cdb6b2ff059", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-acfa368545208146", "level": "error", "message": {"text": "Dangling fetch: POST /api/articles/${jobId}/social-automation/${runId}/approve (apps/web/src/features/social/SocialPreviewPanel.tsx:358)"}, "properties": {"repobilityId": "0698c965ba78f780", "scanner": "scanner-primary", "fingerprint": "acfa368545208146", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d38a29a7aa3704b", "level": "error", "message": {"text": "Dangling fetch: POST /api/social-automation/${runId}/approve/${slotKey} (apps/web/src/features/social/SocialPreviewPanel.tsx:381)"}, "properties": {"repobilityId": "da7110ba77fd1327", "scanner": "scanner-primary", "fingerprint": "2d38a29a7aa3704b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-118e69f0700b86f0", "level": "error", "message": {"text": "Dangling fetch: POST /api/social-automation/${runId}/regenerate/${slotKey} (apps/web/src/features/social/SocialPreviewPanel.tsx:404)"}, "properties": {"repobilityId": "13d794cc971b50a7", "scanner": "scanner-primary", "fingerprint": "118e69f0700b86f0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c0b84dbd005e197", "level": "error", "message": {"text": "Dangling fetch: GET /api/social/connections (apps/web/src/features/idea-capture/useIdeaCapture.ts:64)"}, "properties": {"repobilityId": "839d6091f0ce86dd", "scanner": "scanner-primary", "fingerprint": "3c0b84dbd005e197", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7408daa34b279ef2", "level": "error", "message": {"text": "Dangling fetch: GET /api/api-keys (apps/web/src/features/idea-capture/useIdeaCapture.ts:75)"}, "properties": {"repobilityId": "0aa4274c9a66c412", "scanner": "scanner-primary", "fingerprint": "7408daa34b279ef2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7f8b0a783556fde3", "level": "error", "message": {"text": "Dangling fetch: POST /api/templates/seed (apps/web/src/features/idea-capture/useIdeaCapture.ts:97)"}, "properties": {"repobilityId": "f0b45719fb577565", "scanner": "scanner-primary", "fingerprint": "7f8b0a783556fde3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-74266d76846d7001", "level": "error", "message": {"text": "Dangling fetch: GET /api/templates (apps/web/src/features/idea-capture/useIdeaCapture.ts:120)"}, "properties": {"repobilityId": "838f68a88b428e5a", "scanner": "scanner-primary", "fingerprint": "74266d76846d7001", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-070bc13b15c13053", "level": "error", "message": {"text": "Dangling fetch: POST /api/images/upload (apps/web/src/features/idea-capture/useIdeaCapture.ts:281)"}, "properties": {"repobilityId": "d2d5b827182327e9", "scanner": "scanner-primary", "fingerprint": "070bc13b15c13053", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8363053d38ba2e33", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:38)"}, "properties": {"repobilityId": "3edf0325262b56ea", "scanner": "scanner-primary", "fingerprint": "8363053d38ba2e33", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dde79ae5b104a843", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:65)"}, "properties": {"repobilityId": "8e32802bbef0618b", "scanner": "scanner-primary", "fingerprint": "dde79ae5b104a843", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e5f4039b06a693fe", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:102)"}, "properties": {"repobilityId": "15ce90e4feac6e0b", "scanner": "scanner-primary", "fingerprint": "e5f4039b06a693fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0897f1a9dad0ad24", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:129)"}, "properties": {"repobilityId": "afe05e2df1602a32", "scanner": "scanner-primary", "fingerprint": "0897f1a9dad0ad24", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-338ff54c8861b785", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:155)"}, "properties": {"repobilityId": "d2c7bb9bd1696583", "scanner": "scanner-primary", "fingerprint": "338ff54c8861b785", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b6e2f28f4a8b1206", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:182)"}, "properties": {"repobilityId": "d1b04d8fd3317f4e", "scanner": "scanner-primary", "fingerprint": "b6e2f28f4a8b1206", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e71b3c7ad7df563a", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:203)"}, "properties": {"repobilityId": "ffd69a8efceeb429", "scanner": "scanner-primary", "fingerprint": "e71b3c7ad7df563a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-74aa7409cecc6792", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (apps/web/src/features/post-editor/usePostEditor.ts:237)"}, "properties": {"repobilityId": "4cfde20b68a824fa", "scanner": "scanner-primary", "fingerprint": "74aa7409cecc6792", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d685074765ab3bb", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts/publish (apps/web/src/features/post-editor/usePostEditor.ts:258)"}, "properties": {"repobilityId": "b046123b8b7f7095", "scanner": "scanner-primary", "fingerprint": "9d685074765ab3bb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c246efcef0055afe", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:288)"}, "properties": {"repobilityId": "690217288f20fa5b", "scanner": "scanner-primary", "fingerprint": "c246efcef0055afe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9175061a72fc60ad", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:318)"}, "properties": {"repobilityId": "d6fede43b0dbdfa0", "scanner": "scanner-primary", "fingerprint": "9175061a72fc60ad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-92f60176a1d6ee38", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/post-editor/usePostEditor.ts:344)"}, "properties": {"repobilityId": "cd1c33e2e351e294", "scanner": "scanner-primary", "fingerprint": "92f60176a1d6ee38", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a39680ffa3e6ea1", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:369)"}, "properties": {"repobilityId": "875fe9de77816fca", "scanner": "scanner-primary", "fingerprint": "7a39680ffa3e6ea1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-74db20897da0af01", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts/${publishedPost.id}/sync-analytics (apps/web/src/features/post-editor/usePostEditor.ts:472)"}, "properties": {"repobilityId": "8b33db65c4d3621e", "scanner": "scanner-primary", "fingerprint": "74db20897da0af01", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2b302462cc11facf", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:485)"}, "properties": {"repobilityId": "698424d90de12afb", "scanner": "scanner-primary", "fingerprint": "2b302462cc11facf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d43e259270bb55e", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/posts/${postId} (apps/web/src/features/post-editor/usePostEditor.ts:515)"}, "properties": {"repobilityId": "0ba4723f7ea83ee7", "scanner": "scanner-primary", "fingerprint": "2d43e259270bb55e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6764f6e8a00356f6", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:531)"}, "properties": {"repobilityId": "15adcc4595966b4b", "scanner": "scanner-primary", "fingerprint": "6764f6e8a00356f6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-08c0980536160ce5", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:593)"}, "properties": {"repobilityId": "32b3324113ad7943", "scanner": "scanner-primary", "fingerprint": "08c0980536160ce5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd33a5d5aae1cd26", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:606)"}, "properties": {"repobilityId": "8b8889c4e41b6fff", "scanner": "scanner-primary", "fingerprint": "bd33a5d5aae1cd26", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2a65dcf5799a1321", "level": "error", "message": {"text": "Dangling fetch: POST /api/images/upload (apps/web/src/features/post-editor/usePostEditor.ts:655)"}, "properties": {"repobilityId": "70a98d9f5c63091d", "scanner": "scanner-primary", "fingerprint": "2a65dcf5799a1321", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc3eb4a4232725c3", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:678)"}, "properties": {"repobilityId": "246a112bbc2514fb", "scanner": "scanner-primary", "fingerprint": "dc3eb4a4232725c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f10b779d67675215", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/images/upload (apps/web/src/features/post-editor/usePostEditor.ts:731)"}, "properties": {"repobilityId": "dfc286bebdd12902", "scanner": "scanner-primary", "fingerprint": "f10b779d67675215", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-57ac67ec81e248c2", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:747)"}, "properties": {"repobilityId": "bfb9afb2f53e0fe4", "scanner": "scanner-primary", "fingerprint": "57ac67ec81e248c2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c764853d55dff85d", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/drafts/${id} (apps/web/src/features/post-editor/usePostEditor.ts:792)"}, "properties": {"repobilityId": "0175ce20c8e53b74", "scanner": "scanner-primary", "fingerprint": "c764853d55dff85d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68dcd86f8d00daef", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts (apps/web/src/features/posts-list/usePostsList.ts:20)"}, "properties": {"repobilityId": "e3bf93a59f8c0544", "scanner": "scanner-primary", "fingerprint": "68dcd86f8d00daef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1fe99ed5a735ce20", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/drafts/${draftId} (apps/web/src/features/posts-list/usePostsList.ts:116)"}, "properties": {"repobilityId": "acfd6e377322048d", "scanner": "scanner-primary", "fingerprint": "1fe99ed5a735ce20", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e8d2b70d5eea5c53", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts/${draftId} (apps/web/src/features/posts-list/usePostsList.ts:150)"}, "properties": {"repobilityId": "4329945b04ef5350", "scanner": "scanner-primary", "fingerprint": "e8d2b70d5eea5c53", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1140a8257dec004e", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (apps/web/src/features/posts-list/usePostsList.ts:225)"}, "properties": {"repobilityId": "bfd3dfcc09842be6", "scanner": "scanner-primary", "fingerprint": "1140a8257dec004e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b4732935b9c4d0d4", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts/publish (apps/web/src/features/posts-list/usePostsList.ts:240)"}, "properties": {"repobilityId": "454360c8cac72466", "scanner": "scanner-primary", "fingerprint": "b4732935b9c4d0d4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c3c94d66c0e0aa24", "level": "error", "message": {"text": "Dangling fetch: GET /api/drafts/${draftId} (apps/web/src/features/posts-list/usePostsList.ts:308)"}, "properties": {"repobilityId": "08d48488dd5d7033", "scanner": "scanner-primary", "fingerprint": "c3c94d66c0e0aa24", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-af1cb18170c1326a", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/posts-list/usePostsList.ts:382)"}, "properties": {"repobilityId": "2b7ddbcca192a77e", "scanner": "scanner-primary", "fingerprint": "af1cb18170c1326a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9ca31da5d283b5c5", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/posts-list/usePostsList.ts:406)"}, "properties": {"repobilityId": "818dc7416813d207", "scanner": "scanner-primary", "fingerprint": "9ca31da5d283b5c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc2ccd2ee7a7184b", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts (apps/web/src/features/posts-list/usePostsList.ts:447)"}, "properties": {"repobilityId": "7e6f3e8cd4161558", "scanner": "scanner-primary", "fingerprint": "cc2ccd2ee7a7184b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-44957dad378cd286", "level": "error", "message": {"text": "Dangling fetch: POST https://openrouter.ai/api/v1/chat/completions (packages/shared/src/imageGeneration.ts:121)"}, "properties": {"repobilityId": "5b7301bc5ec4ee92", "scanner": "scanner-primary", "fingerprint": "44957dad378cd286", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-564fc12f1b6ad7ab", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (packages/shared/src/imageGeneration.ts:307)"}, "properties": {"repobilityId": "bab661e94e7a41bf", "scanner": "scanner-primary", "fingerprint": "564fc12f1b6ad7ab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-efdb4652254266d0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.replicate.com/v1/predictions (packages/shared/src/imageGeneration.ts:359)"}, "properties": {"repobilityId": "44df58e877690379", "scanner": "scanner-primary", "fingerprint": "efdb4652254266d0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d3be9dc10c4bdee5", "level": "error", "message": {"text": "Dangling fetch: GET https://api.replicate.com/v1/predictions/${predictionId} (packages/shared/src/imageGeneration.ts:393)"}, "properties": {"repobilityId": "8f99fbe7e9bb7e8b", "scanner": "scanner-primary", "fingerprint": "d3be9dc10c4bdee5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eac6d91d3f1a389c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twitter.com/2/oauth2/token (packages/shared/src/twitterApi.ts:915)"}, "properties": {"repobilityId": "90d2c9b870c6e399", "scanner": "scanner-primary", "fingerprint": "eac6d91d3f1a389c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-970eb92d6ec2bfaa", "level": "note", "message": {"text": "Unused endpoint: POST /generate"}, "properties": {"repobilityId": "edc37f534c3a2362", "scanner": "scanner-primary", "fingerprint": "970eb92d6ec2bfaa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7187270dbe26d6a3", "level": "note", "message": {"text": "Unused endpoint: POST /analyze-writing-style"}, "properties": {"repobilityId": "f2799646aa9e3454", "scanner": "scanner-primary", "fingerprint": "7187270dbe26d6a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3426bb34f344615", "level": "note", "message": {"text": "Unused endpoint: POST /generate-prompt"}, "properties": {"repobilityId": "e97c6cc6abad2003", "scanner": "scanner-primary", "fingerprint": "e3426bb34f344615", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6236b283b79811b8", "level": "note", "message": {"text": "Unused endpoint: POST /upload"}, "properties": {"repobilityId": "6a778c5836317301", "scanner": "scanner-primary", "fingerprint": "6236b283b79811b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7b69439a60cb2a4", "level": "note", "message": {"text": "Unused endpoint: DELETE /upload"}, "properties": {"repobilityId": "2e21b31f1f31d8e2", "scanner": "scanner-primary", "fingerprint": "e7b69439a60cb2a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4dd502cbd5c495a2", "level": "note", "message": {"text": "Unused endpoint: POST /social/generate/pitch"}, "properties": {"repobilityId": "fea975483e4b9c08", "scanner": "scanner-primary", "fingerprint": "4dd502cbd5c495a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-05a5ae732e0e48b8", "level": "note", "message": {"text": "Unused endpoint: POST /social/generate/video-reel"}, "properties": {"repobilityId": "9901e7b67ccdc352", "scanner": "scanner-primary", "fingerprint": "05a5ae732e0e48b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-34f412bcb3d34319", "level": "note", "message": {"text": "Unused endpoint: POST /social/generate/hook-video"}, "properties": {"repobilityId": "ff5f63ebd91b8a30", "scanner": "scanner-primary", "fingerprint": "34f412bcb3d34319", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab32d347884ebe7e", "level": "note", "message": {"text": "Unused endpoint: POST /social/generate/quote-video"}, "properties": {"repobilityId": "5934c3f068815ac6", "scanner": "scanner-primary", "fingerprint": "ab32d347884ebe7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b2178e3261ed654", "level": "note", "message": {"text": "Unused endpoint: POST /social/generate/loop-video"}, "properties": {"repobilityId": "91c1289e24ef63ee", "scanner": "scanner-primary", "fingerprint": "8b2178e3261ed654", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8f3d8aecd30d9dd", "level": "note", "message": {"text": "Unused endpoint: GET /articles"}, "properties": {"repobilityId": "14e1e836f4969966", "scanner": "scanner-primary", "fingerprint": "f8f3d8aecd30d9dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "a7b9d247d7e02fa9", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-05bda4fdb9422a33", "level": "note", "message": {"text": "Unused endpoint: GET /queues.json"}, "properties": {"repobilityId": "c45fcf6c1862914d", "scanner": "scanner-primary", "fingerprint": "05bda4fdb9422a33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00fee6399c46f4c0", "level": "note", "message": {"text": "Unused endpoint: GET /recent-failures.json"}, "properties": {"repobilityId": "d673e979d4e5c72c", "scanner": "scanner-primary", "fingerprint": "00fee6399c46f4c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06229c7179a9ec61", "level": "note", "message": {"text": "Unused endpoint: GET /pg-stats.json"}, "properties": {"repobilityId": "7a1807973b6efcf9", "scanner": "scanner-primary", "fingerprint": "06229c7179a9ec61", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84720af82d99ec93", "level": "note", "message": {"text": "Unused endpoint: POST /voice/verify"}, "properties": {"repobilityId": "ee2f3c5654b80a6f", "scanner": "scanner-primary", "fingerprint": "84720af82d99ec93", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aff3644454917a85", "level": "note", "message": {"text": "Unused endpoint: GET /llm-keys"}, "properties": {"repobilityId": "8cd89eefa7ce1729", "scanner": "scanner-primary", "fingerprint": "aff3644454917a85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-18917045b6a1cb0f", "level": "note", "message": {"text": "Unused endpoint: POST /llm-keys/migrate"}, "properties": {"repobilityId": "1e4665741bdaec57", "scanner": "scanner-primary", "fingerprint": "18917045b6a1cb0f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-738ecac73439acba", "level": "note", "message": {"text": "Unused endpoint: GET /music"}, "properties": {"repobilityId": "c2bc375e9b8f0efb", "scanner": "scanner-primary", "fingerprint": "738ecac73439acba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b35bd9f55090e24", "level": "note", "message": {"text": "Unused endpoint: POST /music"}, "properties": {"repobilityId": "8dff9760cd16e586", "scanner": "scanner-primary", "fingerprint": "5b35bd9f55090e24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-841e50bf821e4158", "level": "note", "message": {"text": "Unused endpoint: GET /users"}, "properties": {"repobilityId": "2875fb35e216a9c2", "scanner": "scanner-primary", "fingerprint": "841e50bf821e4158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01a333a34760fca3", "level": "note", "message": {"text": "Unused endpoint: GET /prompts"}, "properties": {"repobilityId": "5016d19e97cda6ea", "scanner": "scanner-primary", "fingerprint": "01a333a34760fca3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dc4a3dae769cf19c", "level": "note", "message": {"text": "Unused endpoint: GET /platform-settings"}, "properties": {"repobilityId": "fbfd55de09c5ac06", "scanner": "scanner-primary", "fingerprint": "dc4a3dae769cf19c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a036d47a1a9b85fd", "level": "note", "message": {"text": "Unused endpoint: GET /schema-type-rules"}, "properties": {"repobilityId": "f321427bf432f0de", "scanner": "scanner-primary", "fingerprint": "a036d47a1a9b85fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}