{"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-5488c4477d20bd63", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/MetaPixel.tsx:15", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/MetaPixel.tsx:15"}, "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-10c9c65f33b443a0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:118", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:118"}, "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-56f277bdab304fba", "name": "Stray `console.log` in TS/JS \u2014 app/api/webhooks/stripe/route.ts:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhooks/stripe/route.ts:72"}, "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-5d48c3422472e6ca", "name": "Stray `console.log` in TS/JS \u2014 app/api/webhooks/btcpay/route.ts:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhooks/btcpay/route.ts:83"}, "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-c4ef2681ac3e0e41", "name": "Stray `console.log` in TS/JS \u2014 scripts/prod-tool-sweep.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/prod-tool-sweep.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-57a12747946e10a2", "name": "Stray `console.log` in TS/JS \u2014 server/_core/imageGeneration.ts:614", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/imageGeneration.ts:614"}, "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-25529fe0bef00b81", "name": "Stray `console.log` in TS/JS \u2014 server/_core/envValidation.ts:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/envValidation.ts:97"}, "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-82cb869af5e2a40d", "name": "Stray `console.log` in TS/JS \u2014 server/_core/voiceTranscription.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/voiceTranscription.ts:14"}, "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-1dd24186274bcdbd", "name": "Stray `console.log` in TS/JS \u2014 server/_core/oauth.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/oauth.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-b973180ed9abe83c", "name": "Stray `console.log` in TS/JS \u2014 server/_core/websocket.ts:461", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/websocket.ts:461"}, "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-f51ef34defee757c", "name": "Stray `console.log` in TS/JS \u2014 server/_core/sdk.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/sdk.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62311d518d889691", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/Navbar.tsx:318", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/Navbar.tsx:318"}, "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-80c38e31ee0146fb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ToolPageSchemas.tsx:94", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ToolPageSchemas.tsx:94"}, "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-fb1e521e7392d013", "name": "TODO/FIXME marker in shipping code \u2014 client/src/components/Map.tsx:89", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 client/src/components/Map.tsx:89"}, "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-cc3014c27beaac75", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/SocialPublish.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/SocialPublish.tsx:87"}, "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-e16b9c1125d8202f", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ShareButton.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ShareButton.tsx:75"}, "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-1a712e3367fcd8ce", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/DashboardLayout.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/DashboardLayout.tsx:174"}, "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-8a823f2d25c62be8", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/timeline/TimelineClip.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/timeline/TimelineClip.tsx:196"}, "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-30aedfae6cbeba70", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/timeline/PropertiesPanel.tsx:351", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/timeline/PropertiesPanel.tsx:351"}, "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-c70b82b881ca0587", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/timeline/TimelineTrack.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/timeline/TimelineTrack.tsx:65"}, "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-a7b3db9745e9c497", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ui/chart.tsx:81", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ui/chart.tsx:81"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5b9ad332e7b3621", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ProjectDetail.tsx:451", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ProjectDetail.tsx:451"}, "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-48903bd40f80838d", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolFashionLookbook.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolFashionLookbook.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2371be8b9c35450f", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/SellerDashboard.tsx:223", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/SellerDashboard.tsx:223"}, "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-04d0a1462e7a2bb2", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolStatusAdmin.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolStatusAdmin.tsx:146"}, "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-4f5778f7b2078e2e", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolIgCarousel.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolIgCarousel.tsx:100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2efeba2982bf6cab", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Credits.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Credits.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-d945f947cddbe028", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/MarketplaceDetail.tsx:324", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/MarketplaceDetail.tsx:324"}, "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-1ce65a4e4da7a5ad", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolZineSpread.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolZineSpread.tsx:74"}, "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-01d376ea579860e7", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/MusicVideoStudio.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/MusicVideoStudio.tsx:136"}, "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-2474c3a5ca553acd", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolStyleTransfer.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolStyleTransfer.tsx:176"}, "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-60dea3f6fc9bf308", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Profile.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Profile.tsx:153"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1cd2c6cad3070559", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/SearchGenerations.tsx:141", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/SearchGenerations.tsx:141"}, "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-cbdd2551c2855954", "name": "Stray `console.log` in TS/JS \u2014 client/src/pages/ComponentShowcase.tsx:197", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 client/src/pages/ComponentShowcase.tsx:197"}, "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-0f5319fb21168ef1", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Workspace.tsx:816", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Workspace.tsx:816"}, "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-40e587acbd9e01f2", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolYtChapterThumbnails.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolYtChapterThumbnails.tsx:103"}, "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-b1426f7a6d452a3b", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Moderation.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Moderation.tsx:220"}, "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-1c9eb6d0e78f5f16", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolBatchPrompts.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolBatchPrompts.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-607d9b4d35be479c", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/DesignCanvas.tsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/DesignCanvas.tsx:229"}, "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-3f4a4f9b2f6c9f69", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/PresentationBuilder.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/PresentationBuilder.tsx:234"}, "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-43d6dd58661e5c0e", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDashboard.tsx:781", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDashboard.tsx:781"}, "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-94cfc1e75bdf4072", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolStickerPack.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolStickerPack.tsx:79"}, "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-9b4c30d4b155feec", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolColorPalette.tsx:252", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolColorPalette.tsx:252"}, "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-0ecdeaa9b85f29cd", "name": "Dockerfile runs as root: runpod-worker/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: runpod-worker/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cdae4e52383c6bc3", "name": "Docker base image is tag-pinned but not digest-pinned: runpod/pytorch:1.0.3-cu1281-torch280-ubuntu2204", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: runpod/pytorch:1.0.3-cu1281-torch280-ubuntu2204"}, "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-d166850bf1952971", "name": "Insecure pattern 'dangerous_innerhtml' in app/MetaPixel.tsx:15", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/MetaPixel.tsx:15"}, "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-99404635f2589a84", "name": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:118", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:118"}, "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-5d2e1fa05fa18960", "name": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ToolPageSchemas.tsx:94", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ToolPageSchemas.tsx:94"}, "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-8df37d9232a59094", "name": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ui/chart.tsx:81", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ui/chart.tsx:81"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71ea10aa1c444c87", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/github-script@v7 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ead23affb4ae84d8", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/github-script@v7 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33357027cf60fd13", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@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": "low", "confidence": 1.0}}, {"id": "scanner-67ad83b2c8ffad7c", "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-b97f54bd2aa0f57b", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@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": "low", "confidence": 1.0}}, {"id": "scanner-c66d90689ce5c2f3", "name": "Very large file: server/routers.ts (5471 lines)", "shortDescription": {"text": "Very large file: server/routers.ts (5471 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-d3e328bcfc02fa63", "name": "Very large file: client/src/pages/VideoStudio.tsx (1270 lines)", "shortDescription": {"text": "Very large file: client/src/pages/VideoStudio.tsx (1270 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-9604d5fef6c2afd5", "name": "Very large file: client/src/pages/Credits.tsx (2258 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Credits.tsx (2258 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-cfb82aa1f8415f5d", "name": "Very large file: client/src/pages/ComponentShowcase.tsx (1437 lines)", "shortDescription": {"text": "Very large file: client/src/pages/ComponentShowcase.tsx (1437 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-1bf82f53e3aaaf63", "name": "Very large file: client/src/pages/Workspace.tsx (1204 lines)", "shortDescription": {"text": "Very large file: client/src/pages/Workspace.tsx (1204 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-bd3b37e8172116de", "name": "Very large file: shared/toolSeoCopy.ts (2199 lines)", "shortDescription": {"text": "Very large file: shared/toolSeoCopy.ts (2199 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "32 test file(s) for 688 source file(s) (ratio 0.05). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 173 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 271 placeholder/mock markers across 141 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-93e4675ef60427e2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/providers.tsx:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/providers.tsx: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-29a777ba236ae943", "name": "Commented-code block (8 lines) in app/api/trpc/[trpc]/route.ts:5", "shortDescription": {"text": "Commented-code block (8 lines) in app/api/trpc/[trpc]/route.ts:5"}, "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-0b0855461bd7bdc2", "name": "Commented-code block (5 lines) in app/api/webhooks/stripe/route.ts:336", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/webhooks/stripe/route.ts:336"}, "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-57094e9f5490a0c6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-demo-generate.mjs:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-demo-generate.mjs:14"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ab4da885711c4316", "name": "Legacy-named symbol `all_copy` in scripts/gen-tool-seo-copy.py:139", "shortDescription": {"text": "Legacy-named symbol `all_copy` in scripts/gen-tool-seo-copy.py:139"}, "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-622cbee38117a5fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/winback-2026-06-12.mjs:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/winback-2026-06-12.mjs:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85e7165c20cca1ad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/indexnow-ping.mjs:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/indexnow-ping.mjs:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b92c7577e322a040", "name": "Commented-code block (5 lines) in server/routers.ts:4676", "shortDescription": {"text": "Commented-code block (5 lines) in server/routers.ts:4676"}, "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-730fa2721ab83db1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/routers.ts:2248", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routers.ts:2248"}, "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-bb3e123b8cd53656", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/llm.ts:359", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/llm.ts:359"}, "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-53b8da8785e40f66", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/fal.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/fal.ts:63"}, "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-577407039c439ba5", "name": "Commented-code block (5 lines) in server/_core/imageGeneration.ts:468", "shortDescription": {"text": "Commented-code block (5 lines) in server/_core/imageGeneration.ts:468"}, "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-006e2835e89e4f86", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/imageGeneration.ts:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/imageGeneration.ts:101"}, "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-a1055026d3bf3494", "name": "Commented-code block (7 lines) in server/_core/cookies.ts:28", "shortDescription": {"text": "Commented-code block (7 lines) in server/_core/cookies.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-ee4da2241360abb9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/modelTraining.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/modelTraining.ts:72"}, "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-4e10d718db12e93e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/replicate.ts:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/replicate.ts:102"}, "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-fc983965e956e2bc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/videoGeneration.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/videoGeneration.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-63388381d87440f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/dataApi.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/dataApi.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-c895968505b611b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/map.ts:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/map.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-6990611c9a41c3a5", "name": "Commented-code block (5 lines) in server/_core/env.ts:25", "shortDescription": {"text": "Commented-code block (5 lines) in server/_core/env.ts:25"}, "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-5dbd43a7b4bede9b", "name": "Commented-code block (7 lines) in server/_core/trpc.ts:20", "shortDescription": {"text": "Commented-code block (7 lines) in server/_core/trpc.ts:20"}, "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-27d7a8d34b08b399", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/runpod.ts:160", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/runpod.ts:160"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f847005e1bf19bbe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/fal.ts:144", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/fal.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-01a4f8e08a40109a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/kling.ts:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/kling.ts:110"}, "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-393f0315a7d6bd48", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/replicate.ts:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/replicate.ts:89"}, "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-4efa033dbba94652", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/runway.ts:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/runway.ts:86"}, "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-a9bb65c69ee404c7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/openai.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/openai.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-aea212e8f3382add", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/synclabs.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/synclabs.ts:68"}, "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-5ca973a30d2bb802", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/grok.ts:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/grok.ts:82"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-637ca6342dcd19cd", "name": "Commented-code block (5 lines) in drizzle/schema.ts:504", "shortDescription": {"text": "Commented-code block (5 lines) in drizzle/schema.ts:504"}, "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-40c9dea58056f006", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lora-training/scripts/generate-training-data.mjs:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lora-training/scripts/generate-training-data.mjs:51"}, "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-455b326d38be749a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolVectorize.tsx:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolVectorize.tsx:51"}, "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-1cff1c6ada4b7d3e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolInpainting.tsx:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolInpainting.tsx:60"}, "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-a5f00788aa37f929", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolListingPhotos.tsx:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolListingPhotos.tsx:47"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc1df2d74bde14de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolInteriorDesign.tsx:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolInteriorDesign.tsx:80"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-30ce368b348eb38d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolMockup.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolMockup.tsx:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-03a67a6f483f9010", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolCanvas.tsx:144", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolCanvas.tsx: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-8f46bf8bdd91137c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolRealEstateTwilight.tsx:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolRealEstateTwilight.tsx:47"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe5cc5926c3f8ed6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolFaceEnhancer.tsx:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolFaceEnhancer.tsx:62"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aecf5c1a0a3a9f68", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageToVideo.tsx:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageToVideo.tsx:58"}, "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-851d98a1419455a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolSketchToImage.tsx:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolSketchToImage.tsx:69"}, "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-b28963269bb7aa1e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolDepthMap.tsx:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolDepthMap.tsx:46"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ec0aa3f6694c6b48", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolRelight.tsx:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolRelight.tsx:67"}, "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-6e2402affcff2c25", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolOutpainting.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolOutpainting.tsx:73"}, "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-f0626485f4d456f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageCaption.tsx:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageCaption.tsx:68"}, "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-1a6da21c9ba67a0d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageToPrompt.tsx:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageToPrompt.tsx:71"}, "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-7a6327f9bc92cf43", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/Tool3DGenerator.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/Tool3DGenerator.tsx:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42fed12132ed2eb6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolCollage.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolCollage.tsx: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-cd282ee5133c1b84", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolProductPhoto.tsx:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolProductPhoto.tsx:63"}, "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-ff4f947d35d548ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPhotoRestore.tsx:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPhotoRestore.tsx:62"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c176c411679ed8a6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolNlEdit.tsx:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolNlEdit.tsx:52"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b219959e6442ef74", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageBlender.tsx:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageBlender.tsx:66"}, "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-f7856c06209b34e3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolUpscaler.tsx:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolUpscaler.tsx:95"}, "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-102a9177e6b8951e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolObjectEraser.tsx:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolObjectEraser.tsx:70"}, "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-1e1482c77779b99e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolTransparentPng.tsx:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolTransparentPng.tsx: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-0861dd9c687e600e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolBackground.tsx:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolBackground.tsx:70"}, "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-66cee51a75925043", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolFilmGrain.tsx:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolFilmGrain.tsx:67"}, "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-906908efe6483274", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolHeadshot.tsx:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolHeadshot.tsx:70"}, "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-07610cf93a8282c2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolAvatar.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolAvatar.tsx:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43e83ae58c9870e9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPetPortrait.tsx:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPetPortrait.tsx:49"}, "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-df36772d0a9f20e3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPanorama.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPanorama.tsx:53"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e467e735c69af39c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolSocialResize.tsx:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolSocialResize.tsx:51"}, "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-b40c2ebaa62813ec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolStyleTransfer.tsx:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolStyleTransfer.tsx: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-e969312d85c0f848", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolVariations.tsx:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolVariations.tsx:60"}, "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-746235171a5682da", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolHdrEnhance.tsx:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolHdrEnhance.tsx:55"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-04e962a3bbf919bf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolThumbnail.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolThumbnail.tsx:73"}, "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-d7f45f14288a738c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolColorGrading.tsx:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolColorGrading.tsx:72"}, "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-3a3644a430845661", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolVirtualTryOn.tsx:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolVirtualTryOn.tsx: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-1ed3b37a9b64b6ed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolColorPalette.tsx:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolColorPalette.tsx:68"}, "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-59754a1b883e3adf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPhotoColorize.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPhotoColorize.tsx:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-91fcd33874ee1de2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:68"}, "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-d785c17821858dcb", "name": "22 env vars used in code but missing from .env.example", "shortDescription": {"text": "22 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `APP_URL`, `AUTH_RESEND_KEY`, `AUTH_SECRET`, `BASE_URL`, `BTCPAY_API_KEY`, `BTCPAY_STORE_ID`, `BTCPAY_URL`, `BTCPAY_WEBHOOK_SECRET` + 14 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/gen-showcases-3.py:load_key, scripts/gen-tool-seo-copy.py:load_key, scripts/gen-showcases-2.py:load_key\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/gen-showcases-3.py:request_image, scripts/gen-showcases-2.py:request_image\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d561d7e48b2140af", "name": "Dangling fetch: POST /api/trpc/demo.generate?batch=1 (scripts/test-demo-generate.mjs:14)", "shortDescription": {"text": "Dangling fetch: POST /api/trpc/demo.generate?batch=1 (scripts/test-demo-generate.mjs:14)"}, "fullDescription": {"text": "`scripts/test-demo-generate.mjs:14` calls `POST /api/trpc/demo.generate?batch=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trpc/demo.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-ddc151db7b2e49e4", "name": "Dangling fetch: POST https://api.resend.com/emails (scripts/winback-2026-06-12.mjs:56)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (scripts/winback-2026-06-12.mjs:56)"}, "fullDescription": {"text": "`scripts/winback-2026-06-12.mjs:56` 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-46fedc9800ee2ba2", "name": "Dangling fetch: POST https://api.indexnow.org/IndexNow (scripts/indexnow-ping.mjs:27)", "shortDescription": {"text": "Dangling fetch: POST https://api.indexnow.org/IndexNow (scripts/indexnow-ping.mjs:27)"}, "fullDescription": {"text": "`scripts/indexnow-ping.mjs:27` calls `POST https://api.indexnow.org/IndexNow` 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.indexnow.org/indexnow`\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-8a52634b933bf7fa", "name": "Dangling fetch: POST https://api.x.ai/v1/images/generations (lora-training/scripts/generate-training-data.mjs:29)", "shortDescription": {"text": "Dangling fetch: POST https://api.x.ai/v1/images/generations (lora-training/scripts/generate-training-data.mjs:29)"}, "fullDescription": {"text": "`lora-training/scripts/generate-training-data.mjs:29` calls `POST https://api.x.ai/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.x.ai/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-d097b059d191300e", "name": "Dangling fetch: POST https://api.x.ai/v1/images/generations (lora-training/scripts/generate-training-data.mjs:51)", "shortDescription": {"text": "Dangling fetch: POST https://api.x.ai/v1/images/generations (lora-training/scripts/generate-training-data.mjs:51)"}, "fullDescription": {"text": "`lora-training/scripts/generate-training-data.mjs:51` calls `POST https://api.x.ai/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.x.ai/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-d70a90887b3b6451", "name": "Dangling fetch: POST https://api.openai.com/v1/audio/speech (server/routers.ts:2248)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/speech (server/routers.ts:2248)"}, "fullDescription": {"text": "`server/routers.ts:2248` calls `POST https://api.openai.com/v1/audio/speech` 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/audio/speech`\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-779a5ed90e275013", "name": "Dangling fetch: POST https://api.replicate.com/v1/predictions (server/routers.ts:3136)", "shortDescription": {"text": "Dangling fetch: POST https://api.replicate.com/v1/predictions (server/routers.ts:3136)"}, "fullDescription": {"text": "`server/routers.ts:3136` 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-76d6019d51a787ce", "name": "Dangling fetch: GET https://api.replicate.com/v1/predictions/${prediction.id} (server/routers.ts:3154)", "shortDescription": {"text": "Dangling fetch: GET https://api.replicate.com/v1/predictions/${prediction.id} (server/routers.ts:3154)"}, "fullDescription": {"text": "`server/routers.ts:3154` calls `GET https://api.replicate.com/v1/predictions/${prediction.id}` 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-3f0892dc554bb357", "name": "Dangling fetch: POST https://queue.fal.run/${model} (server/_core/fal.ts:41)", "shortDescription": {"text": "Dangling fetch: POST https://queue.fal.run/${model} (server/_core/fal.ts:41)"}, "fullDescription": {"text": "`server/_core/fal.ts:41` calls `POST https://queue.fal.run/${model}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/queue.fal.run/<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-4d5ee1b7030c00d9", "name": "Dangling fetch: POST https://api.x.ai/v1/images/generations (server/_core/imageGeneration.ts:66)", "shortDescription": {"text": "Dangling fetch: POST https://api.x.ai/v1/images/generations (server/_core/imageGeneration.ts:66)"}, "fullDescription": {"text": "`server/_core/imageGeneration.ts:66` calls `POST https://api.x.ai/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.x.ai/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-d124262f3947f3f5", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (server/_core/imageGeneration.ts:134)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (server/_core/imageGeneration.ts:134)"}, "fullDescription": {"text": "`server/_core/imageGeneration.ts:134` 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-2f7b24a742cfdbb7", "name": "Dangling fetch: POST https://api.stability.ai/v2beta/stable-image/generate/sd3 (server/_core/imageGeneration.ts:256)", "shortDescription": {"text": "Dangling fetch: POST https://api.stability.ai/v2beta/stable-image/generate/sd3 (server/_core/imageGeneration.ts:256)"}, "fullDescription": {"text": "`server/_core/imageGeneration.ts:256` calls `POST https://api.stability.ai/v2beta/stable-image/generate/sd3` 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.stability.ai/v2beta/stable-image/generate/sd3`\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-5489d72dc64f3c44", "name": "Dangling fetch: POST https://api.together.xyz/v1/images/generations (server/_core/imageGeneration.ts:357)", "shortDescription": {"text": "Dangling fetch: POST https://api.together.xyz/v1/images/generations (server/_core/imageGeneration.ts:357)"}, "fullDescription": {"text": "`server/_core/imageGeneration.ts:357` calls `POST https://api.together.xyz/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.together.xyz/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-eacf6d7b22b81f0e", "name": "Dangling fetch: POST https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/run/@cf/black-forest-labs/flux-1-schn", "shortDescription": {"text": "Dangling fetch: POST https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/run/@cf/black-forest-labs/flux-1-schnell (server/_core/imageGeneration.ts:397)"}, "fullDescription": {"text": "`server/_core/imageGeneration.ts:397` calls `POST https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/run/@cf/black-forest-labs/flux-1-schnell` 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.cloudflare.com/client/v4/accounts/<p>/ai/run/@cf/black-forest-labs/flux-1-schnell`\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-a2ac3769bc067e15", "name": "Dangling fetch: POST https://queue.fal.run/${falModel} (server/_core/imageGeneration.ts:454)", "shortDescription": {"text": "Dangling fetch: POST https://queue.fal.run/${falModel} (server/_core/imageGeneration.ts:454)"}, "fullDescription": {"text": "`server/_core/imageGeneration.ts:454` calls `POST https://queue.fal.run/${falModel}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/queue.fal.run/<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-658a49cd2ffb2aa4", "name": "Dangling fetch: POST https://queue.fal.run/${FAL_TRAINER} (server/_core/modelTraining.ts:84)", "shortDescription": {"text": "Dangling fetch: POST https://queue.fal.run/${FAL_TRAINER} (server/_core/modelTraining.ts:84)"}, "fullDescription": {"text": "`server/_core/modelTraining.ts:84` calls `POST https://queue.fal.run/${FAL_TRAINER}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/queue.fal.run/<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-2d0811e5aee2117a", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolVectorize.tsx:51)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolVectorize.tsx:51)"}, "fullDescription": {"text": "`client/src/pages/ToolVectorize.tsx:51` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-acea7d22066eba38", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolInpainting.tsx:60)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolInpainting.tsx:60)"}, "fullDescription": {"text": "`client/src/pages/ToolInpainting.tsx:60` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-72a4becbdbd7f5a0", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolListingPhotos.tsx:47)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolListingPhotos.tsx:47)"}, "fullDescription": {"text": "`client/src/pages/ToolListingPhotos.tsx:47` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-0f662ff7882e2ef1", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolInteriorDesign.tsx:80)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolInteriorDesign.tsx:80)"}, "fullDescription": {"text": "`client/src/pages/ToolInteriorDesign.tsx:80` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-b0a6afad20866a95", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolMockup.tsx:54)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolMockup.tsx:54)"}, "fullDescription": {"text": "`client/src/pages/ToolMockup.tsx:54` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-9a93ffe01c23a487", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolCanvas.tsx:144)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolCanvas.tsx:144)"}, "fullDescription": {"text": "`client/src/pages/ToolCanvas.tsx:144` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-97b89be9248c2d0d", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolRealEstateTwilight.tsx:47)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolRealEstateTwilight.tsx:47)"}, "fullDescription": {"text": "`client/src/pages/ToolRealEstateTwilight.tsx:47` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-dc8b81053e4c97ff", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolFaceEnhancer.tsx:62)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolFaceEnhancer.tsx:62)"}, "fullDescription": {"text": "`client/src/pages/ToolFaceEnhancer.tsx:62` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-c032eaf7b4a30726", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageToVideo.tsx:58)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageToVideo.tsx:58)"}, "fullDescription": {"text": "`client/src/pages/ToolImageToVideo.tsx:58` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-212a5d83a148f7b4", "name": "Dangling fetch: GET /api/status/providers (client/src/pages/ToolStatusAdmin.tsx:54)", "shortDescription": {"text": "Dangling fetch: GET /api/status/providers (client/src/pages/ToolStatusAdmin.tsx:54)"}, "fullDescription": {"text": "`client/src/pages/ToolStatusAdmin.tsx:54` calls `GET /api/status/providers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/status/providers`\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-251993dfc33e9278", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolSketchToImage.tsx:69)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolSketchToImage.tsx:69)"}, "fullDescription": {"text": "`client/src/pages/ToolSketchToImage.tsx:69` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-3372a5fec6972f78", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolDepthMap.tsx:46)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolDepthMap.tsx:46)"}, "fullDescription": {"text": "`client/src/pages/ToolDepthMap.tsx:46` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-860ee1867042a8d5", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolRelight.tsx:67)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolRelight.tsx:67)"}, "fullDescription": {"text": "`client/src/pages/ToolRelight.tsx:67` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-e1243102d1debaeb", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolOutpainting.tsx:73)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolOutpainting.tsx:73)"}, "fullDescription": {"text": "`client/src/pages/ToolOutpainting.tsx:73` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-232b056aef74311f", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageCaption.tsx:68)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageCaption.tsx:68)"}, "fullDescription": {"text": "`client/src/pages/ToolImageCaption.tsx:68` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-a571180625105f5b", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageToPrompt.tsx:71)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageToPrompt.tsx:71)"}, "fullDescription": {"text": "`client/src/pages/ToolImageToPrompt.tsx:71` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-d9e28f1d581b6b6d", "name": "Dangling fetch: POST /api/upload (client/src/pages/Tool3DGenerator.tsx:56)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/Tool3DGenerator.tsx:56)"}, "fullDescription": {"text": "`client/src/pages/Tool3DGenerator.tsx:56` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-a0fb399d903bb955", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolCollage.tsx:78)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolCollage.tsx:78)"}, "fullDescription": {"text": "`client/src/pages/ToolCollage.tsx:78` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-4f4a431b488485f3", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolProductPhoto.tsx:63)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolProductPhoto.tsx:63)"}, "fullDescription": {"text": "`client/src/pages/ToolProductPhoto.tsx:63` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-c3c5769caedf9277", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolPhotoRestore.tsx:62)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolPhotoRestore.tsx:62)"}, "fullDescription": {"text": "`client/src/pages/ToolPhotoRestore.tsx:62` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-b887b9b7090c60c3", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolNlEdit.tsx:52)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolNlEdit.tsx:52)"}, "fullDescription": {"text": "`client/src/pages/ToolNlEdit.tsx:52` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-e2e502727bf23a3b", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageBlender.tsx:66)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageBlender.tsx:66)"}, "fullDescription": {"text": "`client/src/pages/ToolImageBlender.tsx:66` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-925d2238bdc1290a", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolUpscaler.tsx:95)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolUpscaler.tsx:95)"}, "fullDescription": {"text": "`client/src/pages/ToolUpscaler.tsx:95` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-581b6f9400df6787", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolObjectEraser.tsx:70)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolObjectEraser.tsx:70)"}, "fullDescription": {"text": "`client/src/pages/ToolObjectEraser.tsx:70` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-0c2e21d392173a4a", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolTransparentPng.tsx:45)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolTransparentPng.tsx:45)"}, "fullDescription": {"text": "`client/src/pages/ToolTransparentPng.tsx:45` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-976cb824fb65a9df", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolBackground.tsx:70)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolBackground.tsx:70)"}, "fullDescription": {"text": "`client/src/pages/ToolBackground.tsx:70` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-6f13ca934a0fb504", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolFilmGrain.tsx:67)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolFilmGrain.tsx:67)"}, "fullDescription": {"text": "`client/src/pages/ToolFilmGrain.tsx:67` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-1ccdae8327f8d41c", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolHeadshot.tsx:70)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolHeadshot.tsx:70)"}, "fullDescription": {"text": "`client/src/pages/ToolHeadshot.tsx:70` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-bc9bddc2e6da15db", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolAvatar.tsx:54)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolAvatar.tsx:54)"}, "fullDescription": {"text": "`client/src/pages/ToolAvatar.tsx:54` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-201bc329cdcde8af", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolPetPortrait.tsx:49)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolPetPortrait.tsx:49)"}, "fullDescription": {"text": "`client/src/pages/ToolPetPortrait.tsx:49` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-0be88cfe1a216b0f", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolPanorama.tsx:53)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolPanorama.tsx:53)"}, "fullDescription": {"text": "`client/src/pages/ToolPanorama.tsx:53` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-f08356e09a4c32e9", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolSocialResize.tsx:51)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolSocialResize.tsx:51)"}, "fullDescription": {"text": "`client/src/pages/ToolSocialResize.tsx:51` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-719f278d0b85f9cd", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolStyleTransfer.tsx:74)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolStyleTransfer.tsx:74)"}, "fullDescription": {"text": "`client/src/pages/ToolStyleTransfer.tsx:74` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-e792dd2772518309", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolVariations.tsx:60)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolVariations.tsx:60)"}, "fullDescription": {"text": "`client/src/pages/ToolVariations.tsx:60` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-e7bc4fed486b81bc", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolHdrEnhance.tsx:55)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolHdrEnhance.tsx:55)"}, "fullDescription": {"text": "`client/src/pages/ToolHdrEnhance.tsx:55` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-c4a023b947ef21ce", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolThumbnail.tsx:73)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolThumbnail.tsx:73)"}, "fullDescription": {"text": "`client/src/pages/ToolThumbnail.tsx:73` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-e67cbe1152cdb35d", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolColorGrading.tsx:72)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolColorGrading.tsx:72)"}, "fullDescription": {"text": "`client/src/pages/ToolColorGrading.tsx:72` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-3106e8d049ed6f1b", "name": "Dangling fetch: POST /api/trpc/tools.upscale (client/src/pages/PresentationBuilder.tsx:98)", "shortDescription": {"text": "Dangling fetch: POST /api/trpc/tools.upscale (client/src/pages/PresentationBuilder.tsx:98)"}, "fullDescription": {"text": "`client/src/pages/PresentationBuilder.tsx:98` calls `POST /api/trpc/tools.upscale` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trpc/tools.upscale`\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-9d2e16552ce18ac7", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolVirtualTryOn.tsx:74)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolVirtualTryOn.tsx:74)"}, "fullDescription": {"text": "`client/src/pages/ToolVirtualTryOn.tsx:74` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-c32a24081180deba", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolColorPalette.tsx:68)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolColorPalette.tsx:68)"}, "fullDescription": {"text": "`client/src/pages/ToolColorPalette.tsx:68` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-53dd06fdb25add4f", "name": "Dangling fetch: POST /api/upload (client/src/pages/ToolPhotoColorize.tsx:59)", "shortDescription": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolPhotoColorize.tsx:59)"}, "fullDescription": {"text": "`client/src/pages/ToolPhotoColorize.tsx:59` calls `POST /api/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-acbaaa9e533b33f5", "name": "Unused endpoint: GET /api/oauth/callback", "shortDescription": {"text": "Unused endpoint: GET /api/oauth/callback"}, "fullDescription": {"text": "`server/_core/oauth.ts` declares `GET /api/oauth/callback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/25292"}, "properties": {"repository": "daxkensington/dreamforge-ai", "repoUrl": "https://github.com/daxkensington/dreamforge-ai", "branch": "main"}, "results": [{"ruleId": "scanner-5488c4477d20bd63", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/MetaPixel.tsx:15"}, "properties": {"repobilityId": "1c96a3872b4ba4d0", "scanner": "scanner-primary", "fingerprint": "5488c4477d20bd63", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-10c9c65f33b443a0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:118"}, "properties": {"repobilityId": "6f16eb9b82a2dcd6", "scanner": "scanner-primary", "fingerprint": "10c9c65f33b443a0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-56f277bdab304fba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhooks/stripe/route.ts:72"}, "properties": {"repobilityId": "820f2a9402f92ee7", "scanner": "scanner-primary", "fingerprint": "56f277bdab304fba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d48c3422472e6ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhooks/btcpay/route.ts:83"}, "properties": {"repobilityId": "0b725aa59e4e34b0", "scanner": "scanner-primary", "fingerprint": "5d48c3422472e6ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c4ef2681ac3e0e41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/prod-tool-sweep.ts:67"}, "properties": {"repobilityId": "ae65548c18655995", "scanner": "scanner-primary", "fingerprint": "c4ef2681ac3e0e41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-57a12747946e10a2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/imageGeneration.ts:614"}, "properties": {"repobilityId": "ac1c7ecd2c56ee53", "scanner": "scanner-primary", "fingerprint": "57a12747946e10a2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25529fe0bef00b81", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/envValidation.ts:97"}, "properties": {"repobilityId": "ebe4e1ce4272a9aa", "scanner": "scanner-primary", "fingerprint": "25529fe0bef00b81", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-82cb869af5e2a40d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/voiceTranscription.ts:14"}, "properties": {"repobilityId": "b01c83469f71cf51", "scanner": "scanner-primary", "fingerprint": "82cb869af5e2a40d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1dd24186274bcdbd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/oauth.ts:52"}, "properties": {"repobilityId": "627efa8024eaa52b", "scanner": "scanner-primary", "fingerprint": "1dd24186274bcdbd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b973180ed9abe83c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/websocket.ts:461"}, "properties": {"repobilityId": "91c1157a7bbaaf09", "scanner": "scanner-primary", "fingerprint": "b973180ed9abe83c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f51ef34defee757c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/_core/sdk.ts:34"}, "properties": {"repobilityId": "e4e38532158319c4", "scanner": "scanner-primary", "fingerprint": "f51ef34defee757c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-62311d518d889691", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/Navbar.tsx:318"}, "properties": {"repobilityId": "ead2a1e3112c5417", "scanner": "scanner-primary", "fingerprint": "62311d518d889691", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80c38e31ee0146fb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ToolPageSchemas.tsx:94"}, "properties": {"repobilityId": "da37aa5484472954", "scanner": "scanner-primary", "fingerprint": "80c38e31ee0146fb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fb1e521e7392d013", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 client/src/components/Map.tsx:89"}, "properties": {"repobilityId": "6b51f4034677d225", "scanner": "scanner-primary", "fingerprint": "fb1e521e7392d013", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-cc3014c27beaac75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/SocialPublish.tsx:87"}, "properties": {"repobilityId": "4f170080c4c7d6ce", "scanner": "scanner-primary", "fingerprint": "cc3014c27beaac75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e16b9c1125d8202f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/ShareButton.tsx:75"}, "properties": {"repobilityId": "dfbf924b1ff5e02c", "scanner": "scanner-primary", "fingerprint": "e16b9c1125d8202f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a712e3367fcd8ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/DashboardLayout.tsx:174"}, "properties": {"repobilityId": "f6824b43e2afadd4", "scanner": "scanner-primary", "fingerprint": "1a712e3367fcd8ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a823f2d25c62be8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/timeline/TimelineClip.tsx:196"}, "properties": {"repobilityId": "21bfa2b4deecc0bc", "scanner": "scanner-primary", "fingerprint": "8a823f2d25c62be8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30aedfae6cbeba70", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/timeline/PropertiesPanel.tsx:351"}, "properties": {"repobilityId": "8d3b9bb8184da268", "scanner": "scanner-primary", "fingerprint": "30aedfae6cbeba70", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c70b82b881ca0587", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/timeline/TimelineTrack.tsx:65"}, "properties": {"repobilityId": "f41f82ca44ed49fb", "scanner": "scanner-primary", "fingerprint": "c70b82b881ca0587", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7b3db9745e9c497", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/components/ui/chart.tsx:81"}, "properties": {"repobilityId": "1c3a04e593515dbe", "scanner": "scanner-primary", "fingerprint": "a7b3db9745e9c497", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d5b9ad332e7b3621", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ProjectDetail.tsx:451"}, "properties": {"repobilityId": "1bcaf5db95f1dff5", "scanner": "scanner-primary", "fingerprint": "d5b9ad332e7b3621", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48903bd40f80838d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolFashionLookbook.tsx:99"}, "properties": {"repobilityId": "9bdbfd823382d4ab", "scanner": "scanner-primary", "fingerprint": "48903bd40f80838d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2371be8b9c35450f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/SellerDashboard.tsx:223"}, "properties": {"repobilityId": "3fb779b3b22cd1d9", "scanner": "scanner-primary", "fingerprint": "2371be8b9c35450f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-04d0a1462e7a2bb2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolStatusAdmin.tsx:146"}, "properties": {"repobilityId": "9c37b82802bd3cba", "scanner": "scanner-primary", "fingerprint": "04d0a1462e7a2bb2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f5778f7b2078e2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolIgCarousel.tsx:100"}, "properties": {"repobilityId": "565955d1b1b3dd91", "scanner": "scanner-primary", "fingerprint": "4f5778f7b2078e2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2efeba2982bf6cab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Credits.tsx:173"}, "properties": {"repobilityId": "a2a295b0ed40a80a", "scanner": "scanner-primary", "fingerprint": "2efeba2982bf6cab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d945f947cddbe028", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/MarketplaceDetail.tsx:324"}, "properties": {"repobilityId": "5995b505ee322205", "scanner": "scanner-primary", "fingerprint": "d945f947cddbe028", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ce65a4e4da7a5ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolZineSpread.tsx:74"}, "properties": {"repobilityId": "e8a7235cd577c22b", "scanner": "scanner-primary", "fingerprint": "1ce65a4e4da7a5ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01d376ea579860e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/MusicVideoStudio.tsx:136"}, "properties": {"repobilityId": "d42fff9e2e3a8cfa", "scanner": "scanner-primary", "fingerprint": "01d376ea579860e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2474c3a5ca553acd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolStyleTransfer.tsx:176"}, "properties": {"repobilityId": "cc8c2af722ba160d", "scanner": "scanner-primary", "fingerprint": "2474c3a5ca553acd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60dea3f6fc9bf308", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Profile.tsx:153"}, "properties": {"repobilityId": "744d0029c7747da3", "scanner": "scanner-primary", "fingerprint": "60dea3f6fc9bf308", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1cd2c6cad3070559", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/SearchGenerations.tsx:141"}, "properties": {"repobilityId": "f3e4c3597dbba730", "scanner": "scanner-primary", "fingerprint": "1cd2c6cad3070559", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbdd2551c2855954", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 client/src/pages/ComponentShowcase.tsx:197"}, "properties": {"repobilityId": "625b517500d9096d", "scanner": "scanner-primary", "fingerprint": "cbdd2551c2855954", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f5319fb21168ef1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Workspace.tsx:816"}, "properties": {"repobilityId": "8e3b922c8d7d6039", "scanner": "scanner-primary", "fingerprint": "0f5319fb21168ef1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40e587acbd9e01f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolYtChapterThumbnails.tsx:103"}, "properties": {"repobilityId": "109e2a38a31967f3", "scanner": "scanner-primary", "fingerprint": "40e587acbd9e01f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1426f7a6d452a3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/Moderation.tsx:220"}, "properties": {"repobilityId": "3d68b50cfd5eb0d3", "scanner": "scanner-primary", "fingerprint": "b1426f7a6d452a3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c9eb6d0e78f5f16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolBatchPrompts.tsx:130"}, "properties": {"repobilityId": "70b5930f1596236d", "scanner": "scanner-primary", "fingerprint": "1c9eb6d0e78f5f16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-607d9b4d35be479c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/DesignCanvas.tsx:229"}, "properties": {"repobilityId": "0d0d844bf545e47d", "scanner": "scanner-primary", "fingerprint": "607d9b4d35be479c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f4a4f9b2f6c9f69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/PresentationBuilder.tsx:234"}, "properties": {"repobilityId": "c9d225e9e098099e", "scanner": "scanner-primary", "fingerprint": "3f4a4f9b2f6c9f69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-43d6dd58661e5c0e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/AdminDashboard.tsx:781"}, "properties": {"repobilityId": "3d8cf5e6861d9280", "scanner": "scanner-primary", "fingerprint": "43d6dd58661e5c0e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94cfc1e75bdf4072", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolStickerPack.tsx:79"}, "properties": {"repobilityId": "f9a0b435fafe1daa", "scanner": "scanner-primary", "fingerprint": "94cfc1e75bdf4072", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b4c30d4b155feec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/pages/ToolColorPalette.tsx:252"}, "properties": {"repobilityId": "8263c5384064c89c", "scanner": "scanner-primary", "fingerprint": "9b4c30d4b155feec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ecdeaa9b85f29cd", "level": "warning", "message": {"text": "Dockerfile runs as root: runpod-worker/Dockerfile"}, "properties": {"repobilityId": "6396514c61aa4942", "scanner": "scanner-primary", "fingerprint": "0ecdeaa9b85f29cd", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-cdae4e52383c6bc3", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: runpod/pytorch:1.0.3-cu1281-torch280-ubuntu2204"}, "properties": {"repobilityId": "e78a1a62a817dfaf", "scanner": "scanner-primary", "fingerprint": "cdae4e52383c6bc3", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "runpod-worker/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d166850bf1952971", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/MetaPixel.tsx:15"}, "properties": {"repobilityId": "3773e5c6947d4060", "scanner": "scanner-primary", "fingerprint": "d166850bf1952971", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/MetaPixel.tsx"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-99404635f2589a84", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:118"}, "properties": {"repobilityId": "69d4743587f721a0", "scanner": "scanner-primary", "fingerprint": "99404635f2589a84", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/layout.tsx"}, "region": {"startLine": 118}}}]}, {"ruleId": "scanner-5d2e1fa05fa18960", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ToolPageSchemas.tsx:94"}, "properties": {"repobilityId": "e57343ab418a58d1", "scanner": "scanner-primary", "fingerprint": "5d2e1fa05fa18960", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/components/ToolPageSchemas.tsx"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-8df37d9232a59094", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/components/ui/chart.tsx:81"}, "properties": {"repobilityId": "298aaf10501f50f1", "scanner": "scanner-primary", "fingerprint": "8df37d9232a59094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/components/ui/chart.tsx"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-71ea10aa1c444c87", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d2d338742c5a0e11", "scanner": "scanner-primary", "fingerprint": "71ea10aa1c444c87", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/link-check-preview.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-ead23affb4ae84d8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ff1548641ed472d9", "scanner": "scanner-primary", "fingerprint": "ead23affb4ae84d8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/uptime.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-ead23affb4ae84d8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ff1548641ed472d9", "scanner": "scanner-primary", "fingerprint": "ead23affb4ae84d8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/uptime.yml"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-33357027cf60fd13", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eed3ec2d5ebd766f", "scanner": "scanner-primary", "fingerprint": "33357027cf60fd13", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/runpod-worker-build.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-33357027cf60fd13", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f76c72fbb1a2edb0", "scanner": "scanner-primary", "fingerprint": "33357027cf60fd13", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/runpod-worker-build.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-33357027cf60fd13", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3bdafa346eee881a", "scanner": "scanner-primary", "fingerprint": "33357027cf60fd13", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/runpod-worker-build.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-33357027cf60fd13", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5c4850e42307686f", "scanner": "scanner-primary", "fingerprint": "33357027cf60fd13", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/runpod-worker-build.yml"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-67ad83b2c8ffad7c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "7a9a3e52a56a8db1", "scanner": "scanner-primary", "fingerprint": "67ad83b2c8ffad7c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/runpod-worker-build.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b97f54bd2aa0f57b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7ca7c5a69aa6442a", "scanner": "scanner-primary", "fingerprint": "b97f54bd2aa0f57b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/smoke.yml"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-b97f54bd2aa0f57b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ffe9ec07daf47076", "scanner": "scanner-primary", "fingerprint": "b97f54bd2aa0f57b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/smoke.yml"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-c66d90689ce5c2f3", "level": "note", "message": {"text": "Very large file: server/routers.ts (5471 lines)"}, "properties": {"repobilityId": "54c5d0a3c75d415b", "scanner": "scanner-primary", "fingerprint": "c66d90689ce5c2f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d3e328bcfc02fa63", "level": "note", "message": {"text": "Very large file: client/src/pages/VideoStudio.tsx (1270 lines)"}, "properties": {"repobilityId": "c93965f2ecd014c1", "scanner": "scanner-primary", "fingerprint": "d3e328bcfc02fa63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9604d5fef6c2afd5", "level": "note", "message": {"text": "Very large file: client/src/pages/Credits.tsx (2258 lines)"}, "properties": {"repobilityId": "68cc0cbd4aab52e4", "scanner": "scanner-primary", "fingerprint": "9604d5fef6c2afd5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cfb82aa1f8415f5d", "level": "note", "message": {"text": "Very large file: client/src/pages/ComponentShowcase.tsx (1437 lines)"}, "properties": {"repobilityId": "96a173a0d62b652e", "scanner": "scanner-primary", "fingerprint": "cfb82aa1f8415f5d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1bf82f53e3aaaf63", "level": "note", "message": {"text": "Very large file: client/src/pages/Workspace.tsx (1204 lines)"}, "properties": {"repobilityId": "9a440001149f42d7", "scanner": "scanner-primary", "fingerprint": "1bf82f53e3aaaf63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bd3b37e8172116de", "level": "note", "message": {"text": "Very large file: shared/toolSeoCopy.ts (2199 lines)"}, "properties": {"repobilityId": "45afa095c2c33460", "scanner": "scanner-primary", "fingerprint": "bd3b37e8172116de", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "4d8997432850593b", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "88c4603d370b17b9", "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": "70332d982de97e5b", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "f6cb128016958df6", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "61e16fa37791cf34", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-93e4675ef60427e2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/providers.tsx:33"}, "properties": {"repobilityId": "55b3bf8bcbad7577", "scanner": "scanner-primary", "fingerprint": "93e4675ef60427e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-29a777ba236ae943", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/api/trpc/[trpc]/route.ts:5"}, "properties": {"repobilityId": "305a69750e59c99c", "scanner": "scanner-primary", "fingerprint": "29a777ba236ae943", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b0855461bd7bdc2", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/webhooks/stripe/route.ts:336"}, "properties": {"repobilityId": "e3ec3ee47be21a07", "scanner": "scanner-primary", "fingerprint": "0b0855461bd7bdc2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57094e9f5490a0c6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-demo-generate.mjs:14"}, "properties": {"repobilityId": "5fcda36d6de829be", "scanner": "scanner-primary", "fingerprint": "57094e9f5490a0c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ab4da885711c4316", "level": "note", "message": {"text": "Legacy-named symbol `all_copy` in scripts/gen-tool-seo-copy.py:139"}, "properties": {"repobilityId": "e0a75abcdda3b94d", "scanner": "scanner-primary", "fingerprint": "ab4da885711c4316", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-622cbee38117a5fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/winback-2026-06-12.mjs:56"}, "properties": {"repobilityId": "b89d24adc18ce7d2", "scanner": "scanner-primary", "fingerprint": "622cbee38117a5fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-85e7165c20cca1ad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/indexnow-ping.mjs:27"}, "properties": {"repobilityId": "38a367d21524efd2", "scanner": "scanner-primary", "fingerprint": "85e7165c20cca1ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b92c7577e322a040", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/routers.ts:4676"}, "properties": {"repobilityId": "b36a2b85deb74b43", "scanner": "scanner-primary", "fingerprint": "b92c7577e322a040", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-730fa2721ab83db1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routers.ts:2248"}, "properties": {"repobilityId": "901c834e51724686", "scanner": "scanner-primary", "fingerprint": "730fa2721ab83db1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb3e123b8cd53656", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/llm.ts:359"}, "properties": {"repobilityId": "549e997498af4562", "scanner": "scanner-primary", "fingerprint": "bb3e123b8cd53656", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-53b8da8785e40f66", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/fal.ts:63"}, "properties": {"repobilityId": "024a1c21bb0e70fc", "scanner": "scanner-primary", "fingerprint": "53b8da8785e40f66", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-577407039c439ba5", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/_core/imageGeneration.ts:468"}, "properties": {"repobilityId": "0b36e2b62cfda12c", "scanner": "scanner-primary", "fingerprint": "577407039c439ba5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-006e2835e89e4f86", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/imageGeneration.ts:101"}, "properties": {"repobilityId": "b913c86df70abc75", "scanner": "scanner-primary", "fingerprint": "006e2835e89e4f86", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a1055026d3bf3494", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/_core/cookies.ts:28"}, "properties": {"repobilityId": "62d4e943ce2d5685", "scanner": "scanner-primary", "fingerprint": "a1055026d3bf3494", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee4da2241360abb9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/modelTraining.ts:72"}, "properties": {"repobilityId": "e81d54c342f7e804", "scanner": "scanner-primary", "fingerprint": "ee4da2241360abb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4e10d718db12e93e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/replicate.ts:102"}, "properties": {"repobilityId": "34da226250ef172d", "scanner": "scanner-primary", "fingerprint": "4e10d718db12e93e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fc983965e956e2bc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/videoGeneration.ts:30"}, "properties": {"repobilityId": "06a34d00e1c7ad90", "scanner": "scanner-primary", "fingerprint": "fc983965e956e2bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-63388381d87440f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/dataApi.ts:31"}, "properties": {"repobilityId": "59c8d55833bbf770", "scanner": "scanner-primary", "fingerprint": "63388381d87440f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c895968505b611b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/map.ts:74"}, "properties": {"repobilityId": "3f801d7d4a46ad95", "scanner": "scanner-primary", "fingerprint": "c895968505b611b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6990611c9a41c3a5", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/_core/env.ts:25"}, "properties": {"repobilityId": "988b5750a4ea0849", "scanner": "scanner-primary", "fingerprint": "6990611c9a41c3a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5dbd43a7b4bede9b", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/_core/trpc.ts:20"}, "properties": {"repobilityId": "7df627f2205bec5d", "scanner": "scanner-primary", "fingerprint": "5dbd43a7b4bede9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27d7a8d34b08b399", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/runpod.ts:160"}, "properties": {"repobilityId": "bb2a878f91428189", "scanner": "scanner-primary", "fingerprint": "27d7a8d34b08b399", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f847005e1bf19bbe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/fal.ts:144"}, "properties": {"repobilityId": "447c8de0894c32af", "scanner": "scanner-primary", "fingerprint": "f847005e1bf19bbe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-01a4f8e08a40109a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/kling.ts:110"}, "properties": {"repobilityId": "94c84bff98b64ad7", "scanner": "scanner-primary", "fingerprint": "01a4f8e08a40109a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-393f0315a7d6bd48", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/replicate.ts:89"}, "properties": {"repobilityId": "6025141b32b68022", "scanner": "scanner-primary", "fingerprint": "393f0315a7d6bd48", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4efa033dbba94652", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/runway.ts:86"}, "properties": {"repobilityId": "89a0f9a0ee2b4e4e", "scanner": "scanner-primary", "fingerprint": "4efa033dbba94652", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a9bb65c69ee404c7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/openai.ts:29"}, "properties": {"repobilityId": "79b163620744b795", "scanner": "scanner-primary", "fingerprint": "a9bb65c69ee404c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aea212e8f3382add", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/synclabs.ts:68"}, "properties": {"repobilityId": "1bd9f8a8d8b619f4", "scanner": "scanner-primary", "fingerprint": "aea212e8f3382add", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5ca973a30d2bb802", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/_core/providers/grok.ts:82"}, "properties": {"repobilityId": "eaafcdf58f0907df", "scanner": "scanner-primary", "fingerprint": "5ca973a30d2bb802", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-637ca6342dcd19cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in drizzle/schema.ts:504"}, "properties": {"repobilityId": "fe021d8222d71d73", "scanner": "scanner-primary", "fingerprint": "637ca6342dcd19cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40c9dea58056f006", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lora-training/scripts/generate-training-data.mjs:51"}, "properties": {"repobilityId": "1d556822af798f88", "scanner": "scanner-primary", "fingerprint": "40c9dea58056f006", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-455b326d38be749a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolVectorize.tsx:51"}, "properties": {"repobilityId": "2ec899dd686798de", "scanner": "scanner-primary", "fingerprint": "455b326d38be749a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1cff1c6ada4b7d3e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolInpainting.tsx:60"}, "properties": {"repobilityId": "67f4b2e3f6981b53", "scanner": "scanner-primary", "fingerprint": "1cff1c6ada4b7d3e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a5f00788aa37f929", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolListingPhotos.tsx:47"}, "properties": {"repobilityId": "8aeb8cc2510caf10", "scanner": "scanner-primary", "fingerprint": "a5f00788aa37f929", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc1df2d74bde14de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolInteriorDesign.tsx:80"}, "properties": {"repobilityId": "63c78089064a2101", "scanner": "scanner-primary", "fingerprint": "dc1df2d74bde14de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-30ce368b348eb38d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolMockup.tsx:54"}, "properties": {"repobilityId": "20d5277dc63d9f1f", "scanner": "scanner-primary", "fingerprint": "30ce368b348eb38d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-03a67a6f483f9010", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolCanvas.tsx:144"}, "properties": {"repobilityId": "83523d2a5a0a2ef6", "scanner": "scanner-primary", "fingerprint": "03a67a6f483f9010", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f46bf8bdd91137c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolRealEstateTwilight.tsx:47"}, "properties": {"repobilityId": "0fa344ff76ef57a9", "scanner": "scanner-primary", "fingerprint": "8f46bf8bdd91137c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fe5cc5926c3f8ed6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolFaceEnhancer.tsx:62"}, "properties": {"repobilityId": "69f4917f759a4cfb", "scanner": "scanner-primary", "fingerprint": "fe5cc5926c3f8ed6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aecf5c1a0a3a9f68", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageToVideo.tsx:58"}, "properties": {"repobilityId": "433918fcb593313a", "scanner": "scanner-primary", "fingerprint": "aecf5c1a0a3a9f68", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-851d98a1419455a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolSketchToImage.tsx:69"}, "properties": {"repobilityId": "453dbe9cda069a14", "scanner": "scanner-primary", "fingerprint": "851d98a1419455a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b28963269bb7aa1e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolDepthMap.tsx:46"}, "properties": {"repobilityId": "ecadbb5cb97f989b", "scanner": "scanner-primary", "fingerprint": "b28963269bb7aa1e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec0aa3f6694c6b48", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolRelight.tsx:67"}, "properties": {"repobilityId": "0c542bc646d138c3", "scanner": "scanner-primary", "fingerprint": "ec0aa3f6694c6b48", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6e2402affcff2c25", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolOutpainting.tsx:73"}, "properties": {"repobilityId": "e27f220683034e88", "scanner": "scanner-primary", "fingerprint": "6e2402affcff2c25", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f0626485f4d456f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageCaption.tsx:68"}, "properties": {"repobilityId": "c41ba27e54effe15", "scanner": "scanner-primary", "fingerprint": "f0626485f4d456f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a6da21c9ba67a0d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageToPrompt.tsx:71"}, "properties": {"repobilityId": "5f7d91b604633a9d", "scanner": "scanner-primary", "fingerprint": "1a6da21c9ba67a0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a6327f9bc92cf43", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/Tool3DGenerator.tsx:56"}, "properties": {"repobilityId": "23b3f730fff88a9f", "scanner": "scanner-primary", "fingerprint": "7a6327f9bc92cf43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-42fed12132ed2eb6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolCollage.tsx:78"}, "properties": {"repobilityId": "162fd306b5671872", "scanner": "scanner-primary", "fingerprint": "42fed12132ed2eb6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd282ee5133c1b84", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolProductPhoto.tsx:63"}, "properties": {"repobilityId": "6454158d324b0344", "scanner": "scanner-primary", "fingerprint": "cd282ee5133c1b84", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff4f947d35d548ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPhotoRestore.tsx:62"}, "properties": {"repobilityId": "5a8a2aa540a4ac28", "scanner": "scanner-primary", "fingerprint": "ff4f947d35d548ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c176c411679ed8a6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolNlEdit.tsx:52"}, "properties": {"repobilityId": "9ad83b7be467fcbc", "scanner": "scanner-primary", "fingerprint": "c176c411679ed8a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b219959e6442ef74", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolImageBlender.tsx:66"}, "properties": {"repobilityId": "b4b37ed41c46b3ea", "scanner": "scanner-primary", "fingerprint": "b219959e6442ef74", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f7856c06209b34e3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolUpscaler.tsx:95"}, "properties": {"repobilityId": "be9a3027f270aade", "scanner": "scanner-primary", "fingerprint": "f7856c06209b34e3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-102a9177e6b8951e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolObjectEraser.tsx:70"}, "properties": {"repobilityId": "1c1add77573739c8", "scanner": "scanner-primary", "fingerprint": "102a9177e6b8951e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e1482c77779b99e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolTransparentPng.tsx:45"}, "properties": {"repobilityId": "510177c1c07e87dd", "scanner": "scanner-primary", "fingerprint": "1e1482c77779b99e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0861dd9c687e600e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolBackground.tsx:70"}, "properties": {"repobilityId": "3e47c0c25742ff66", "scanner": "scanner-primary", "fingerprint": "0861dd9c687e600e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-66cee51a75925043", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolFilmGrain.tsx:67"}, "properties": {"repobilityId": "5e44442cd0b89a87", "scanner": "scanner-primary", "fingerprint": "66cee51a75925043", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-906908efe6483274", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolHeadshot.tsx:70"}, "properties": {"repobilityId": "f4657c5458436a28", "scanner": "scanner-primary", "fingerprint": "906908efe6483274", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07610cf93a8282c2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolAvatar.tsx:54"}, "properties": {"repobilityId": "67ddb6924cd5b715", "scanner": "scanner-primary", "fingerprint": "07610cf93a8282c2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-43e83ae58c9870e9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPetPortrait.tsx:49"}, "properties": {"repobilityId": "b447cc83c0104276", "scanner": "scanner-primary", "fingerprint": "43e83ae58c9870e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df36772d0a9f20e3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPanorama.tsx:53"}, "properties": {"repobilityId": "120dcbf16ba56660", "scanner": "scanner-primary", "fingerprint": "df36772d0a9f20e3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e467e735c69af39c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolSocialResize.tsx:51"}, "properties": {"repobilityId": "cb8160c96ab8c386", "scanner": "scanner-primary", "fingerprint": "e467e735c69af39c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b40c2ebaa62813ec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolStyleTransfer.tsx:74"}, "properties": {"repobilityId": "9449690ba741422b", "scanner": "scanner-primary", "fingerprint": "b40c2ebaa62813ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e969312d85c0f848", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolVariations.tsx:60"}, "properties": {"repobilityId": "bcb2c91c866d1042", "scanner": "scanner-primary", "fingerprint": "e969312d85c0f848", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-746235171a5682da", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolHdrEnhance.tsx:55"}, "properties": {"repobilityId": "a9d81e8a015f8159", "scanner": "scanner-primary", "fingerprint": "746235171a5682da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-04e962a3bbf919bf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolThumbnail.tsx:73"}, "properties": {"repobilityId": "474c8b0c8597a386", "scanner": "scanner-primary", "fingerprint": "04e962a3bbf919bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d7f45f14288a738c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolColorGrading.tsx:72"}, "properties": {"repobilityId": "732cb6f458775d27", "scanner": "scanner-primary", "fingerprint": "d7f45f14288a738c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a3644a430845661", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolVirtualTryOn.tsx:74"}, "properties": {"repobilityId": "d02c22e5c147e83a", "scanner": "scanner-primary", "fingerprint": "3a3644a430845661", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ed3b37a9b64b6ed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolColorPalette.tsx:68"}, "properties": {"repobilityId": "5b01286ccba179b7", "scanner": "scanner-primary", "fingerprint": "1ed3b37a9b64b6ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-59754a1b883e3adf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/pages/ToolPhotoColorize.tsx:59"}, "properties": {"repobilityId": "eafeeea6fb28606e", "scanner": "scanner-primary", "fingerprint": "59754a1b883e3adf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-91fcd33874ee1de2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:68"}, "properties": {"repobilityId": "12858d750cb9e152", "scanner": "scanner-primary", "fingerprint": "91fcd33874ee1de2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d785c17821858dcb", "level": "note", "message": {"text": "22 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "f5222babac44ad42", "scanner": "scanner-primary", "fingerprint": "d785c17821858dcb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "53632d30f885e139", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e86b889a1f2d8f5c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2f5bdbc55b9cad20", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "5d11fd00079e2398", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "2fa25328727d6eb2", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-d561d7e48b2140af", "level": "error", "message": {"text": "Dangling fetch: POST /api/trpc/demo.generate?batch=1 (scripts/test-demo-generate.mjs:14)"}, "properties": {"repobilityId": "24b17c9417c26e4f", "scanner": "scanner-primary", "fingerprint": "d561d7e48b2140af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ddc151db7b2e49e4", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (scripts/winback-2026-06-12.mjs:56)"}, "properties": {"repobilityId": "ab40d6d9dc213676", "scanner": "scanner-primary", "fingerprint": "ddc151db7b2e49e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-46fedc9800ee2ba2", "level": "error", "message": {"text": "Dangling fetch: POST https://api.indexnow.org/IndexNow (scripts/indexnow-ping.mjs:27)"}, "properties": {"repobilityId": "e18784889683d4eb", "scanner": "scanner-primary", "fingerprint": "46fedc9800ee2ba2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a52634b933bf7fa", "level": "error", "message": {"text": "Dangling fetch: POST https://api.x.ai/v1/images/generations (lora-training/scripts/generate-training-data.mjs:29)"}, "properties": {"repobilityId": "4ccc910a6f77e88d", "scanner": "scanner-primary", "fingerprint": "8a52634b933bf7fa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d097b059d191300e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.x.ai/v1/images/generations (lora-training/scripts/generate-training-data.mjs:51)"}, "properties": {"repobilityId": "766e056ccbc00474", "scanner": "scanner-primary", "fingerprint": "d097b059d191300e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d70a90887b3b6451", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/speech (server/routers.ts:2248)"}, "properties": {"repobilityId": "6b9e6636f5c5986f", "scanner": "scanner-primary", "fingerprint": "d70a90887b3b6451", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-779a5ed90e275013", "level": "error", "message": {"text": "Dangling fetch: POST https://api.replicate.com/v1/predictions (server/routers.ts:3136)"}, "properties": {"repobilityId": "53d8acce2718bddf", "scanner": "scanner-primary", "fingerprint": "779a5ed90e275013", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-76d6019d51a787ce", "level": "error", "message": {"text": "Dangling fetch: GET https://api.replicate.com/v1/predictions/${prediction.id} (server/routers.ts:3154)"}, "properties": {"repobilityId": "538433720f5c3bb1", "scanner": "scanner-primary", "fingerprint": "76d6019d51a787ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3f0892dc554bb357", "level": "error", "message": {"text": "Dangling fetch: POST https://queue.fal.run/${model} (server/_core/fal.ts:41)"}, "properties": {"repobilityId": "1d949b17a07b9a96", "scanner": "scanner-primary", "fingerprint": "3f0892dc554bb357", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d5ee1b7030c00d9", "level": "error", "message": {"text": "Dangling fetch: POST https://api.x.ai/v1/images/generations (server/_core/imageGeneration.ts:66)"}, "properties": {"repobilityId": "057a4c41cc9de415", "scanner": "scanner-primary", "fingerprint": "4d5ee1b7030c00d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d124262f3947f3f5", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (server/_core/imageGeneration.ts:134)"}, "properties": {"repobilityId": "6973371f1835582f", "scanner": "scanner-primary", "fingerprint": "d124262f3947f3f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2f7b24a742cfdbb7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.stability.ai/v2beta/stable-image/generate/sd3 (server/_core/imageGeneration.ts:256)"}, "properties": {"repobilityId": "c66f6b14c85eeba5", "scanner": "scanner-primary", "fingerprint": "2f7b24a742cfdbb7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5489d72dc64f3c44", "level": "error", "message": {"text": "Dangling fetch: POST https://api.together.xyz/v1/images/generations (server/_core/imageGeneration.ts:357)"}, "properties": {"repobilityId": "0f388de2d8738ad0", "scanner": "scanner-primary", "fingerprint": "5489d72dc64f3c44", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eacf6d7b22b81f0e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/run/@cf/black-forest-labs/flux-1-schnell (server/_core/imageGeneration.ts:397)"}, "properties": {"repobilityId": "5997cd547f00b1ad", "scanner": "scanner-primary", "fingerprint": "eacf6d7b22b81f0e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a2ac3769bc067e15", "level": "error", "message": {"text": "Dangling fetch: POST https://queue.fal.run/${falModel} (server/_core/imageGeneration.ts:454)"}, "properties": {"repobilityId": "d1c1436db540a77a", "scanner": "scanner-primary", "fingerprint": "a2ac3769bc067e15", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-658a49cd2ffb2aa4", "level": "error", "message": {"text": "Dangling fetch: POST https://queue.fal.run/${FAL_TRAINER} (server/_core/modelTraining.ts:84)"}, "properties": {"repobilityId": "958d1e212d794a50", "scanner": "scanner-primary", "fingerprint": "658a49cd2ffb2aa4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d0811e5aee2117a", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolVectorize.tsx:51)"}, "properties": {"repobilityId": "73516846ebe48337", "scanner": "scanner-primary", "fingerprint": "2d0811e5aee2117a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-acea7d22066eba38", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolInpainting.tsx:60)"}, "properties": {"repobilityId": "5af1f06fc0984977", "scanner": "scanner-primary", "fingerprint": "acea7d22066eba38", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-72a4becbdbd7f5a0", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolListingPhotos.tsx:47)"}, "properties": {"repobilityId": "df290e69f2dc1a96", "scanner": "scanner-primary", "fingerprint": "72a4becbdbd7f5a0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0f662ff7882e2ef1", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolInteriorDesign.tsx:80)"}, "properties": {"repobilityId": "cdaa9050190990c2", "scanner": "scanner-primary", "fingerprint": "0f662ff7882e2ef1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b0a6afad20866a95", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolMockup.tsx:54)"}, "properties": {"repobilityId": "b68cd834c8ed9119", "scanner": "scanner-primary", "fingerprint": "b0a6afad20866a95", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9a93ffe01c23a487", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolCanvas.tsx:144)"}, "properties": {"repobilityId": "2582690a9bce7696", "scanner": "scanner-primary", "fingerprint": "9a93ffe01c23a487", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97b89be9248c2d0d", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolRealEstateTwilight.tsx:47)"}, "properties": {"repobilityId": "cfeab886a0fd1971", "scanner": "scanner-primary", "fingerprint": "97b89be9248c2d0d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc8b81053e4c97ff", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolFaceEnhancer.tsx:62)"}, "properties": {"repobilityId": "0827c8c181fb1e54", "scanner": "scanner-primary", "fingerprint": "dc8b81053e4c97ff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c032eaf7b4a30726", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageToVideo.tsx:58)"}, "properties": {"repobilityId": "9c5886e8491a0eae", "scanner": "scanner-primary", "fingerprint": "c032eaf7b4a30726", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-212a5d83a148f7b4", "level": "error", "message": {"text": "Dangling fetch: GET /api/status/providers (client/src/pages/ToolStatusAdmin.tsx:54)"}, "properties": {"repobilityId": "ed28a3699e1a426c", "scanner": "scanner-primary", "fingerprint": "212a5d83a148f7b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-251993dfc33e9278", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolSketchToImage.tsx:69)"}, "properties": {"repobilityId": "695b26794aa369ad", "scanner": "scanner-primary", "fingerprint": "251993dfc33e9278", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3372a5fec6972f78", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolDepthMap.tsx:46)"}, "properties": {"repobilityId": "44770c17362447a2", "scanner": "scanner-primary", "fingerprint": "3372a5fec6972f78", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-860ee1867042a8d5", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolRelight.tsx:67)"}, "properties": {"repobilityId": "17f1fe1c6f07fd73", "scanner": "scanner-primary", "fingerprint": "860ee1867042a8d5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e1243102d1debaeb", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolOutpainting.tsx:73)"}, "properties": {"repobilityId": "8a39dd512e027699", "scanner": "scanner-primary", "fingerprint": "e1243102d1debaeb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-232b056aef74311f", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageCaption.tsx:68)"}, "properties": {"repobilityId": "847eed04bb1fd8e3", "scanner": "scanner-primary", "fingerprint": "232b056aef74311f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a571180625105f5b", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageToPrompt.tsx:71)"}, "properties": {"repobilityId": "78eb485e421e7d86", "scanner": "scanner-primary", "fingerprint": "a571180625105f5b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d9e28f1d581b6b6d", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/Tool3DGenerator.tsx:56)"}, "properties": {"repobilityId": "011d684f748cc37e", "scanner": "scanner-primary", "fingerprint": "d9e28f1d581b6b6d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a0fb399d903bb955", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolCollage.tsx:78)"}, "properties": {"repobilityId": "d04fe4efb8ecaeb7", "scanner": "scanner-primary", "fingerprint": "a0fb399d903bb955", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f4a431b488485f3", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolProductPhoto.tsx:63)"}, "properties": {"repobilityId": "c1b0d756890c31a3", "scanner": "scanner-primary", "fingerprint": "4f4a431b488485f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c3c5769caedf9277", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolPhotoRestore.tsx:62)"}, "properties": {"repobilityId": "900ed83857fd5e86", "scanner": "scanner-primary", "fingerprint": "c3c5769caedf9277", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b887b9b7090c60c3", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolNlEdit.tsx:52)"}, "properties": {"repobilityId": "a2595258a00ea179", "scanner": "scanner-primary", "fingerprint": "b887b9b7090c60c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e2e502727bf23a3b", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolImageBlender.tsx:66)"}, "properties": {"repobilityId": "14f46238951bbc8e", "scanner": "scanner-primary", "fingerprint": "e2e502727bf23a3b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-925d2238bdc1290a", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolUpscaler.tsx:95)"}, "properties": {"repobilityId": "d4e3faf0c7605ca7", "scanner": "scanner-primary", "fingerprint": "925d2238bdc1290a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-581b6f9400df6787", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolObjectEraser.tsx:70)"}, "properties": {"repobilityId": "1c6d207c42b507aa", "scanner": "scanner-primary", "fingerprint": "581b6f9400df6787", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c2e21d392173a4a", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolTransparentPng.tsx:45)"}, "properties": {"repobilityId": "0460309a0aecffa6", "scanner": "scanner-primary", "fingerprint": "0c2e21d392173a4a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-976cb824fb65a9df", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolBackground.tsx:70)"}, "properties": {"repobilityId": "29ae59e933e3210c", "scanner": "scanner-primary", "fingerprint": "976cb824fb65a9df", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6f13ca934a0fb504", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolFilmGrain.tsx:67)"}, "properties": {"repobilityId": "165d993cd25c273f", "scanner": "scanner-primary", "fingerprint": "6f13ca934a0fb504", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ccdae8327f8d41c", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolHeadshot.tsx:70)"}, "properties": {"repobilityId": "5a8c6ec759df46ce", "scanner": "scanner-primary", "fingerprint": "1ccdae8327f8d41c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc9bddc2e6da15db", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolAvatar.tsx:54)"}, "properties": {"repobilityId": "2060243b5c06be5e", "scanner": "scanner-primary", "fingerprint": "bc9bddc2e6da15db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-201bc329cdcde8af", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolPetPortrait.tsx:49)"}, "properties": {"repobilityId": "1e00d6b438388513", "scanner": "scanner-primary", "fingerprint": "201bc329cdcde8af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0be88cfe1a216b0f", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolPanorama.tsx:53)"}, "properties": {"repobilityId": "adff346927e3f4ac", "scanner": "scanner-primary", "fingerprint": "0be88cfe1a216b0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f08356e09a4c32e9", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolSocialResize.tsx:51)"}, "properties": {"repobilityId": "80a1a17506076572", "scanner": "scanner-primary", "fingerprint": "f08356e09a4c32e9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-719f278d0b85f9cd", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolStyleTransfer.tsx:74)"}, "properties": {"repobilityId": "bb07cb0c4a12a80f", "scanner": "scanner-primary", "fingerprint": "719f278d0b85f9cd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e792dd2772518309", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolVariations.tsx:60)"}, "properties": {"repobilityId": "d32e85fcde9450e6", "scanner": "scanner-primary", "fingerprint": "e792dd2772518309", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e7bc4fed486b81bc", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolHdrEnhance.tsx:55)"}, "properties": {"repobilityId": "b91a09312f8c4c9b", "scanner": "scanner-primary", "fingerprint": "e7bc4fed486b81bc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c4a023b947ef21ce", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolThumbnail.tsx:73)"}, "properties": {"repobilityId": "cea781bced417cc5", "scanner": "scanner-primary", "fingerprint": "c4a023b947ef21ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e67cbe1152cdb35d", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolColorGrading.tsx:72)"}, "properties": {"repobilityId": "1b721487b9872b09", "scanner": "scanner-primary", "fingerprint": "e67cbe1152cdb35d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3106e8d049ed6f1b", "level": "error", "message": {"text": "Dangling fetch: POST /api/trpc/tools.upscale (client/src/pages/PresentationBuilder.tsx:98)"}, "properties": {"repobilityId": "762357e99e32918e", "scanner": "scanner-primary", "fingerprint": "3106e8d049ed6f1b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d2e16552ce18ac7", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolVirtualTryOn.tsx:74)"}, "properties": {"repobilityId": "672e22bb110b7269", "scanner": "scanner-primary", "fingerprint": "9d2e16552ce18ac7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c32a24081180deba", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolColorPalette.tsx:68)"}, "properties": {"repobilityId": "005062242bdebd2c", "scanner": "scanner-primary", "fingerprint": "c32a24081180deba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-53dd06fdb25add4f", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload (client/src/pages/ToolPhotoColorize.tsx:59)"}, "properties": {"repobilityId": "a188e9a4539ec4c4", "scanner": "scanner-primary", "fingerprint": "53dd06fdb25add4f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-acbaaa9e533b33f5", "level": "note", "message": {"text": "Unused endpoint: GET /api/oauth/callback"}, "properties": {"repobilityId": "d15b53af0eaa591b", "scanner": "scanner-primary", "fingerprint": "acbaaa9e533b33f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}