{"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-aaa6ed99c533afe7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/QuickAccess.tsx:367", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/QuickAccess.tsx:367"}, "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-5d6e24e1960d8d21", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/UnifiedFileBox/RecentShares.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/UnifiedFileBox/RecentShares.tsx:201"}, "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-b59feb4adfb4466e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/UnifiedFileBox/BoxDownloadView.tsx:362", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/UnifiedFileBox/BoxDownloadView.tsx:362"}, "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-45a10549dd2435cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/UnifiedFileBox/RecentDownloads.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/UnifiedFileBox/RecentDownloads.tsx:186"}, "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-e041d3e92f76e629", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CliSigninPage.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CliSigninPage.tsx:201"}, "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-03e3aab11b1f9cf0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:1181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:1181"}, "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-e9caeda2060006d5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/upload/UploadProgressBar.tsx:39", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/upload/UploadProgressBar.tsx:39"}, "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-565247833195298d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/download/MultiFileList.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/download/MultiFileList.tsx:134"}, "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-8b611b7ec280784d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/history/HistoryMobileCards.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/history/HistoryMobileCards.tsx:222"}, "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-789baeb83325cd73", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/history/HistoryTable.tsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/history/HistoryTable.tsx:261"}, "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-0ec5be022c1d05f5", "name": "Insecure pattern 'local_storage_auth_token' in src/utils/__tests__/recentSessions.test.ts:62", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/utils/__tests__/recentSessions.test.ts:62"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe698653bd2466fc", "name": "Insecure pattern 'local_storage_auth_token' in src/context/AuthContext.tsx:56", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/context/AuthContext.tsx:56"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d327f39ec26a2eae", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/StyledQRCode.tsx:59", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/StyledQRCode.tsx:59"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ccb65b41f81d85d", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/FileThumbnail.tsx:64", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/FileThumbnail.tsx:64"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a55c02b55d7b3117", "name": "Insecure pattern 'local_storage_auth_token' in src/pages/LoginPage.tsx:79", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/LoginPage.tsx:79"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d3e7dfff31f3b449", "name": "Insecure pattern 'local_storage_auth_token' in src/pages/UploadPage.tsx:150", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/UploadPage.tsx:150"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6fb73f1540e21a45", "name": "Very large file: src/pages/SettingsPage.tsx (1994 lines)", "shortDescription": {"text": "Very large file: src/pages/SettingsPage.tsx (1994 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": "5 test file(s) for 125 source file(s) (ratio 0.04). 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-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 12 placeholder/mock markers across 7 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1a303386bac2ad0f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/filePreview.ts:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/filePreview.ts:5"}, "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-4c021d1210e8c62b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/FilePreviewModal.tsx:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/FilePreviewModal.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-ee9e8196f08879ff", "name": "Commented-code block (5 lines) in src/i18n/index.ts:39", "shortDescription": {"text": "Commented-code block (5 lines) in src/i18n/index.ts:39"}, "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-373b5a930bb9b012", "name": "Frontend route `/api-keys/reveal/:token` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/api-keys/reveal/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-537a6b56a34c5714", "name": "Frontend route `/cli-signin/:sessionId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/cli-signin/:sessionId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c2dbd2722fbfa1ff", "name": "Frontend route `/download/:code` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/download/:code` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-001e04a2a5d28321", "name": "Frontend route `/auth/callback/:provider` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/auth/callback/:provider` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51d2c7b46ea9abc2", "name": "Frontend route `/auth/email/magic-link` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/auth/email/magic-link` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-334a7b34fbd2fe95", "name": "Frontend route `/auth/device/result` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/auth/device/result` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24571"}, "properties": {"repository": "bestdevmgp/share-anything-web", "repoUrl": "https://github.com/bestdevmgp/share-anything-web", "branch": "main"}, "results": [{"ruleId": "scanner-aaa6ed99c533afe7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/QuickAccess.tsx:367"}, "properties": {"repobilityId": "6fe1a2a3bce69bf7", "scanner": "scanner-primary", "fingerprint": "aaa6ed99c533afe7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d6e24e1960d8d21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/UnifiedFileBox/RecentShares.tsx:201"}, "properties": {"repobilityId": "e695b459818e56d2", "scanner": "scanner-primary", "fingerprint": "5d6e24e1960d8d21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b59feb4adfb4466e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/UnifiedFileBox/BoxDownloadView.tsx:362"}, "properties": {"repobilityId": "4485c3911522b1a3", "scanner": "scanner-primary", "fingerprint": "b59feb4adfb4466e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-45a10549dd2435cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/UnifiedFileBox/RecentDownloads.tsx:186"}, "properties": {"repobilityId": "3569609a4fe97ddd", "scanner": "scanner-primary", "fingerprint": "45a10549dd2435cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e041d3e92f76e629", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CliSigninPage.tsx:201"}, "properties": {"repobilityId": "1b2ed5d5ec30666f", "scanner": "scanner-primary", "fingerprint": "e041d3e92f76e629", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03e3aab11b1f9cf0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:1181"}, "properties": {"repobilityId": "add0522bc3d8f17c", "scanner": "scanner-primary", "fingerprint": "03e3aab11b1f9cf0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9caeda2060006d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/upload/UploadProgressBar.tsx:39"}, "properties": {"repobilityId": "16d9950857cb2d5f", "scanner": "scanner-primary", "fingerprint": "e9caeda2060006d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-565247833195298d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/download/MultiFileList.tsx:134"}, "properties": {"repobilityId": "c62c1ec1d2950818", "scanner": "scanner-primary", "fingerprint": "565247833195298d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b611b7ec280784d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/history/HistoryMobileCards.tsx:222"}, "properties": {"repobilityId": "efc88651a389ba2a", "scanner": "scanner-primary", "fingerprint": "8b611b7ec280784d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-789baeb83325cd73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/history/HistoryTable.tsx:261"}, "properties": {"repobilityId": "72c3f790c64928ae", "scanner": "scanner-primary", "fingerprint": "789baeb83325cd73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ec5be022c1d05f5", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/utils/__tests__/recentSessions.test.ts:62"}, "properties": {"repobilityId": "9b7fafe031760d09", "scanner": "scanner-primary", "fingerprint": "0ec5be022c1d05f5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/__tests__/recentSessions.test.ts"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-fe698653bd2466fc", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/context/AuthContext.tsx:56"}, "properties": {"repobilityId": "aac0c24813f68a7a", "scanner": "scanner-primary", "fingerprint": "fe698653bd2466fc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/context/AuthContext.tsx"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-d327f39ec26a2eae", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/StyledQRCode.tsx:59"}, "properties": {"repobilityId": "d7e7e5fe1c1b6477", "scanner": "scanner-primary", "fingerprint": "d327f39ec26a2eae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/StyledQRCode.tsx"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-8ccb65b41f81d85d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/FileThumbnail.tsx:64"}, "properties": {"repobilityId": "4283428482ad53dd", "scanner": "scanner-primary", "fingerprint": "8ccb65b41f81d85d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/FileThumbnail.tsx"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-a55c02b55d7b3117", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/LoginPage.tsx:79"}, "properties": {"repobilityId": "2b228abccdc1c800", "scanner": "scanner-primary", "fingerprint": "a55c02b55d7b3117", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/LoginPage.tsx"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-d3e7dfff31f3b449", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/UploadPage.tsx:150"}, "properties": {"repobilityId": "7bc2485c334a9f45", "scanner": "scanner-primary", "fingerprint": "d3e7dfff31f3b449", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/UploadPage.tsx"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-6fb73f1540e21a45", "level": "note", "message": {"text": "Very large file: src/pages/SettingsPage.tsx (1994 lines)"}, "properties": {"repobilityId": "473796bf27d30566", "scanner": "scanner-primary", "fingerprint": "6fb73f1540e21a45", "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": "200e837708da5012", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "86e56bf0ffa72715", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "265b96f02fbc78ad", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "2897669c8dc09ae4", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "ebf27ad7c43dceb2", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-1a303386bac2ad0f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/filePreview.ts:5"}, "properties": {"repobilityId": "d70ce8109f5241cf", "scanner": "scanner-primary", "fingerprint": "1a303386bac2ad0f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4c021d1210e8c62b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/FilePreviewModal.tsx:74"}, "properties": {"repobilityId": "a73293b2e0d66752", "scanner": "scanner-primary", "fingerprint": "4c021d1210e8c62b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee9e8196f08879ff", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/i18n/index.ts:39"}, "properties": {"repobilityId": "d8d3c84078b46653", "scanner": "scanner-primary", "fingerprint": "ee9e8196f08879ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-373b5a930bb9b012", "level": "warning", "message": {"text": "Frontend route `/api-keys/reveal/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e9e2ac1611554ee4", "scanner": "scanner-primary", "fingerprint": "373b5a930bb9b012", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-537a6b56a34c5714", "level": "warning", "message": {"text": "Frontend route `/cli-signin/:sessionId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c536d99127be94bf", "scanner": "scanner-primary", "fingerprint": "537a6b56a34c5714", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c2dbd2722fbfa1ff", "level": "warning", "message": {"text": "Frontend route `/download/:code` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a9c0df24fa4de611", "scanner": "scanner-primary", "fingerprint": "c2dbd2722fbfa1ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-001e04a2a5d28321", "level": "warning", "message": {"text": "Frontend route `/auth/callback/:provider` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "78f9b2d62d8f9268", "scanner": "scanner-primary", "fingerprint": "001e04a2a5d28321", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-51d2c7b46ea9abc2", "level": "warning", "message": {"text": "Frontend route `/auth/email/magic-link` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a0441619b3148c75", "scanner": "scanner-primary", "fingerprint": "51d2c7b46ea9abc2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-334a7b34fbd2fe95", "level": "warning", "message": {"text": "Frontend route `/auth/device/result` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "0c0f69399118fa33", "scanner": "scanner-primary", "fingerprint": "334a7b34fbd2fe95", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}