{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-41634cd207e655a2", "name": "Stray `console.log` in TS/JS \u2014 scripts/make-admin.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/make-admin.js:10"}, "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-338da5d89f78f9b6", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-admin.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-admin.js:5"}, "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-40826d8411f7c04c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/SmsUsage.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SmsUsage.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-ebb3689777f597f3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/SetupStatus.tsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SetupStatus.tsx:198"}, "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-754ae619ac18f6df", "name": "`truncate` class without `title=` for hover reveal \u2014 components/AppShell.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AppShell.tsx:121"}, "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-909903fee4e789ee", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ConnectDemo.tsx:229", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ConnectDemo.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-2a09a9c40529dd69", "name": "`truncate` class without `title=` for hover reveal \u2014 components/MobileBookmarklet.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MobileBookmarklet.tsx:76"}, "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-cd35393e61143531", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/page.tsx:83", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/page.tsx:83"}, "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-6199502f5c8ec303", "name": "Stray `console.log` in TS/JS \u2014 app/layout.tsx:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/layout.tsx:126"}, "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-3d77f448d286846e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:112", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:112"}, "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-dc005bb8a43af8ec", "name": "`truncate` class without `title=` for hover reveal \u2014 app/connect/page.tsx:516", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/connect/page.tsx:516"}, "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-e2a0f7d85c1b98f6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/connect/page.tsx:342", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/connect/page.tsx:342"}, "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-408116818ca55716", "name": "Stray `console.log` in TS/JS \u2014 app/api/schedule-reminders/route.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/schedule-reminders/route.ts:48"}, "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-b1e9653f5fdb240c", "name": "Stray `console.log` in TS/JS \u2014 app/api/admin/users/bulk-delete/route.ts:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/users/bulk-delete/route.ts:101"}, "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-1798935c0b89edfc", "name": "Stray `console.log` in TS/JS \u2014 app/api/admin/reset-password/route.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/reset-password/route.ts:54"}, "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-79fee29b788f42ef", "name": "Stray `console.log` in TS/JS \u2014 app/api/process-scheduled/route.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/process-scheduled/route.ts:20"}, "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-dace45011ed7fd12", "name": "Stray `console.log` in TS/JS \u2014 app/api/cron/route.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/route.ts:30"}, "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-237e38005e64f55f", "name": "Stray `console.log` in TS/JS \u2014 app/api/cancel-message/[id]/route.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cancel-message/[id]/route.ts:43"}, "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-447aed87e95c6beb", "name": "Stray `console.log` in TS/JS \u2014 app/api/send-sms/route.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/send-sms/route.ts:29"}, "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-04f5488cd1027815", "name": "Stray `console.log` in TS/JS \u2014 app/api/stripe/webhook/route.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/stripe/webhook/route.ts:43"}, "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-21b04b3d5e37f553", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/page.tsx:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/page.tsx:91"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0327abf32b86f98", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/page.tsx:666", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/page.tsx:666"}, "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-6ec4cc5dfbe49b09", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/support/page.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/support/page.tsx:210"}, "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-b03d4af3aca609d8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/reminders/page.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/reminders/page.tsx:239"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-840e432758a1ed8b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/faq/page.tsx:101", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/faq/page.tsx:101"}, "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-f75d58e4d25d96db", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/welcome/page.tsx:321", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/welcome/page.tsx:321"}, "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-0066642936b08f5b", "name": "Stray `console.log` in TS/JS \u2014 lib/storage.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/storage.ts:25"}, "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-cc2421a857c2bcc0", "name": "Stray `console.log` in TS/JS \u2014 lib/seed-admin.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/seed-admin.ts:10"}, "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-5144a237e29a5954", "name": "Stray `console.log` in TS/JS \u2014 extension/background.js:2", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 extension/background.js:2"}, "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-fae9062cbda61213", "name": "Stray `console.log` in TS/JS \u2014 extension/content.js:2", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 extension/content.js:2"}, "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-05e25611f2daa15e", "name": "Stray `console.log` in TS/JS \u2014 extension/create-icons.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 extension/create-icons.js:21"}, "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-3acbd3ca9f938087", "name": "Stray `console.log` in TS/JS \u2014 public/usesession-bookmarklet.js:193", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/usesession-bookmarklet.js:193"}, "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-8b7428b2139874e0", "name": "Stray `console.log` in TS/JS \u2014 public/bookmarklet.js:191", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/bookmarklet.js:191"}, "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-8dfd08f34a1b0f55", "name": "Insecure pattern 'new_function_used' in CLAUDE.md:70", "shortDescription": {"text": "Insecure pattern 'new_function_used' in CLAUDE.md:70"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-472d9a2be064ec5e", "name": "Insecure pattern 'dangerous_innerhtml' in app/page.tsx:83", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/page.tsx:83"}, "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-bbc9e4252b0455d3", "name": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:112", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:112"}, "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-377e248246e0cf19", "name": "Insecure pattern 'dangerous_innerhtml' in app/connect/page.tsx:342", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/connect/page.tsx:342"}, "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-fde5c0ce7c43e82c", "name": "Insecure pattern 'cors_wildcard' in app/api/usesession/connect-token/route.ts:11", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in app/api/usesession/connect-token/route.ts:11"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a0987572bba25c6", "name": "Insecure pattern 'dangerous_innerhtml' in app/faq/page.tsx:101", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/faq/page.tsx:101"}, "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-d2fbcf058a16c330", "name": "Insecure pattern 'dangerous_innerhtml' in app/welcome/page.tsx:321", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/welcome/page.tsx:321"}, "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-a6d6bfba38bd2db0", "name": "Insecure pattern 'direct_innerhtml_assignment' in extension/content.js:188", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/content.js:188"}, "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-3bae6394523fbd3b", "name": "Insecure pattern 'local_storage_auth_token' in extension/content.js:229", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in extension/content.js:229"}, "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-5fbeafc2e405bc1f", "name": "Insecure pattern 'direct_innerhtml_assignment' in extension/popup.js:50", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/popup.js:50"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6cfa8445fd9dce55", "name": "Very large file: app/admin/page.tsx (1655 lines)", "shortDescription": {"text": "Very large file: app/admin/page.tsx (1655 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": "1 test file(s) for 159 source file(s) (ratio 0.01). 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 85 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 74 placeholder/mock markers across 22 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b56618f0e9ba5ed", "name": "Commented-code block (5 lines) in components/AppFrame.tsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in components/AppFrame.tsx:11"}, "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-5118679240b71d4c", "name": "Commented-code block (5 lines) in components/SetupStatus.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in components/SetupStatus.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3e0c57c18576f6e2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/CsvImport.tsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/CsvImport.tsx:128"}, "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-3b74d55572ddbf03", "name": "Commented-code block (5 lines) in components/ConnectDemo.tsx:12", "shortDescription": {"text": "Commented-code block (5 lines) in components/ConnectDemo.tsx:12"}, "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-8fee577606ec94f9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/connect/page.tsx:138", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/connect/page.tsx:138"}, "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-377868446ab89eaf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/extract-session/route.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/extract-session/route.ts:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7808627fb20b0dee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/extract-usesession/route.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/extract-usesession/route.ts:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-52d73d717a0f8c68", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/admin/users/route.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/admin/users/route.ts:24"}, "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-76bfe53650bd206e", "name": "Commented-code block (5 lines) in app/api/admin/users/bulk-delete/route.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/admin/users/bulk-delete/route.ts:6"}, "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-55cb2b03977a1819", "name": "Commented-code block (5 lines) in app/api/admin/migrate-emails/route.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/admin/migrate-emails/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-0c1920a4f51f94e0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/admin/comprehensive-analytics/route.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/admin/comprehensive-analytics/route.ts: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-ccee0ebbc25f90fe", "name": "Commented-code block (5 lines) in app/api/admin/shared-sender/route.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/admin/shared-sender/route.ts:14"}, "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-6932a42f17a3387e", "name": "Commented-code block (5 lines) in app/api/twilio/inbound/route.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/twilio/inbound/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-b9308ea0f6e6459e", "name": "Commented-code block (5 lines) in app/api/update-user-subscription/route.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/update-user-subscription/route.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a488487b6506bc9", "name": "Commented-code block (6 lines) in app/api/cron/route.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/cron/route.ts:6"}, "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-38ed86ebb571c602", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/textmagic-stats/route.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/textmagic-stats/route.ts:34"}, "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-edc9ef5f042a9046", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/new/page.tsx:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/new/page.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-df65ac7fd9393f1f", "name": "Commented-code block (5 lines) in app/payment-required/page.tsx:36", "shortDescription": {"text": "Commented-code block (5 lines) in app/payment-required/page.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-01d0f70b05e6afdf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/payment-required/page.tsx:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/payment-required/page.tsx:129"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63fbe9c4c9f58158", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/welcome/page.tsx:196", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/welcome/page.tsx:196"}, "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-370bd30d2911daf4", "name": "Commented-code block (5 lines) in lib/turnstile.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/turnstile.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9bb6ae9931f25dab", "name": "Commented-code block (5 lines) in lib/twilio.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/twilio.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7f9006179c58db9f", "name": "Commented-code block (5 lines) in lib/pairing.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/pairing.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-138a8922eb7f246c", "name": "Commented-code block (6 lines) in lib/reminders.ts:27", "shortDescription": {"text": "Commented-code block (6 lines) in lib/reminders.ts:27"}, "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-3d1a719895da617a", "name": "Commented-code block (6 lines) in lib/sms.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in lib/sms.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-43dab05a3f8494f2", "name": "Commented-code block (5 lines) in lib/bookmarklet.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in lib/bookmarklet.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-c74fefe82fca5ef8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/bookmarklet.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/bookmarklet.ts:40"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2cbff98ed6ac94dd", "name": "Commented-code block (6 lines) in lib/url-guard.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in lib/url-guard.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd130db072f97de7", "name": "Commented-code block (5 lines) in lib/plans.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/plans.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a02d17b80982d32", "name": "Commented-code block (6 lines) in lib/usesession.ts:23", "shortDescription": {"text": "Commented-code block (6 lines) in lib/usesession.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-418a61ff4883c4e5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/usesession.ts:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/usesession.ts: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-6dd61d019205e44a", "name": "Commented-code block (5 lines) in lib/provisioning.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/provisioning.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-979c0f8e080da0ea", "name": "Commented-code block (5 lines) in lib/settings.ts:104", "shortDescription": {"text": "Commented-code block (5 lines) in lib/settings.ts:104"}, "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-d2dbc8eeb4967c0f", "name": "Commented-code block (5 lines) in lib/usage.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in lib/usage.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19738"}, "properties": {"repository": "sirwalterjones/sessionremind", "repoUrl": "https://github.com/sirwalterjones/sessionremind", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-41634cd207e655a2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/make-admin.js:10"}, "properties": {"repobilityId": "bc3777df2de7acd5", "scanner": "scanner-primary", "fingerprint": "41634cd207e655a2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-338da5d89f78f9b6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-admin.js:5"}, "properties": {"repobilityId": "0638d52e096ddb02", "scanner": "scanner-primary", "fingerprint": "338da5d89f78f9b6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40826d8411f7c04c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SmsUsage.tsx:134"}, "properties": {"repobilityId": "ae86c1476955f484", "scanner": "scanner-primary", "fingerprint": "40826d8411f7c04c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebb3689777f597f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SetupStatus.tsx:198"}, "properties": {"repobilityId": "31cce44970aa7c71", "scanner": "scanner-primary", "fingerprint": "ebb3689777f597f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-754ae619ac18f6df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AppShell.tsx:121"}, "properties": {"repobilityId": "f2010e5442fdd75f", "scanner": "scanner-primary", "fingerprint": "754ae619ac18f6df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-909903fee4e789ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ConnectDemo.tsx:229"}, "properties": {"repobilityId": "05f6b2e17211a731", "scanner": "scanner-primary", "fingerprint": "909903fee4e789ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a09a9c40529dd69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MobileBookmarklet.tsx:76"}, "properties": {"repobilityId": "029ef162cd0491c6", "scanner": "scanner-primary", "fingerprint": "2a09a9c40529dd69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd35393e61143531", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/page.tsx:83"}, "properties": {"repobilityId": "6779a4843a9d41ee", "scanner": "scanner-primary", "fingerprint": "cd35393e61143531", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6199502f5c8ec303", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/layout.tsx:126"}, "properties": {"repobilityId": "7edc802c141484f7", "scanner": "scanner-primary", "fingerprint": "6199502f5c8ec303", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3d77f448d286846e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:112"}, "properties": {"repobilityId": "6f16eb9b82a2dcd6", "scanner": "scanner-primary", "fingerprint": "3d77f448d286846e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-dc005bb8a43af8ec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/connect/page.tsx:516"}, "properties": {"repobilityId": "5d17c75e108444e7", "scanner": "scanner-primary", "fingerprint": "dc005bb8a43af8ec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e2a0f7d85c1b98f6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/connect/page.tsx:342"}, "properties": {"repobilityId": "59b6aa24a93a2700", "scanner": "scanner-primary", "fingerprint": "e2a0f7d85c1b98f6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-408116818ca55716", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/schedule-reminders/route.ts:48"}, "properties": {"repobilityId": "b8e84d8875da295f", "scanner": "scanner-primary", "fingerprint": "408116818ca55716", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b1e9653f5fdb240c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/users/bulk-delete/route.ts:101"}, "properties": {"repobilityId": "85dd22be63bba6e2", "scanner": "scanner-primary", "fingerprint": "b1e9653f5fdb240c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1798935c0b89edfc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/reset-password/route.ts:54"}, "properties": {"repobilityId": "3b362630895fa6a1", "scanner": "scanner-primary", "fingerprint": "1798935c0b89edfc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-79fee29b788f42ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/process-scheduled/route.ts:20"}, "properties": {"repobilityId": "7e0cc39c1c9a23e3", "scanner": "scanner-primary", "fingerprint": "79fee29b788f42ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dace45011ed7fd12", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cron/route.ts:30"}, "properties": {"repobilityId": "c3ef661cb37a5346", "scanner": "scanner-primary", "fingerprint": "dace45011ed7fd12", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-237e38005e64f55f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cancel-message/[id]/route.ts:43"}, "properties": {"repobilityId": "db689320121b2536", "scanner": "scanner-primary", "fingerprint": "237e38005e64f55f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-447aed87e95c6beb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/send-sms/route.ts:29"}, "properties": {"repobilityId": "123ae0f8e777be4a", "scanner": "scanner-primary", "fingerprint": "447aed87e95c6beb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04f5488cd1027815", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/stripe/webhook/route.ts:43"}, "properties": {"repobilityId": "20f7efce7c11c4b4", "scanner": "scanner-primary", "fingerprint": "04f5488cd1027815", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-21b04b3d5e37f553", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/page.tsx:91"}, "properties": {"repobilityId": "236c4ac135ad8cc2", "scanner": "scanner-primary", "fingerprint": "21b04b3d5e37f553", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0327abf32b86f98", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/page.tsx:666"}, "properties": {"repobilityId": "9c2c16c32be292da", "scanner": "scanner-primary", "fingerprint": "e0327abf32b86f98", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ec4cc5dfbe49b09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/support/page.tsx:210"}, "properties": {"repobilityId": "c213a6efb8468816", "scanner": "scanner-primary", "fingerprint": "6ec4cc5dfbe49b09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b03d4af3aca609d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/reminders/page.tsx:239"}, "properties": {"repobilityId": "e04f6f484517a58a", "scanner": "scanner-primary", "fingerprint": "b03d4af3aca609d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-840e432758a1ed8b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/faq/page.tsx:101"}, "properties": {"repobilityId": "ac2ffa5e3af2355b", "scanner": "scanner-primary", "fingerprint": "840e432758a1ed8b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f75d58e4d25d96db", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/welcome/page.tsx:321"}, "properties": {"repobilityId": "a95bf5978b0953f7", "scanner": "scanner-primary", "fingerprint": "f75d58e4d25d96db", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0066642936b08f5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/storage.ts:25"}, "properties": {"repobilityId": "f9ed5393bec49552", "scanner": "scanner-primary", "fingerprint": "0066642936b08f5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cc2421a857c2bcc0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/seed-admin.ts:10"}, "properties": {"repobilityId": "295a99c787dbb898", "scanner": "scanner-primary", "fingerprint": "cc2421a857c2bcc0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5144a237e29a5954", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 extension/background.js:2"}, "properties": {"repobilityId": "e037ad0456203f49", "scanner": "scanner-primary", "fingerprint": "5144a237e29a5954", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fae9062cbda61213", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 extension/content.js:2"}, "properties": {"repobilityId": "16faa783bc831477", "scanner": "scanner-primary", "fingerprint": "fae9062cbda61213", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-05e25611f2daa15e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 extension/create-icons.js:21"}, "properties": {"repobilityId": "57b3a01b97153320", "scanner": "scanner-primary", "fingerprint": "05e25611f2daa15e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3acbd3ca9f938087", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/usesession-bookmarklet.js:193"}, "properties": {"repobilityId": "99eba45fe6419db4", "scanner": "scanner-primary", "fingerprint": "3acbd3ca9f938087", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8b7428b2139874e0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/bookmarklet.js:191"}, "properties": {"repobilityId": "ab170da7ec8d9e19", "scanner": "scanner-primary", "fingerprint": "8b7428b2139874e0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8dfd08f34a1b0f55", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in CLAUDE.md:70"}, "properties": {"repobilityId": "c0914e1c0e99ba27", "scanner": "scanner-primary", "fingerprint": "8dfd08f34a1b0f55", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-472d9a2be064ec5e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/page.tsx:83"}, "properties": {"repobilityId": "cfec9d1837258177", "scanner": "scanner-primary", "fingerprint": "472d9a2be064ec5e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/page.tsx"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-bbc9e4252b0455d3", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:112"}, "properties": {"repobilityId": "69d4743587f721a0", "scanner": "scanner-primary", "fingerprint": "bbc9e4252b0455d3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/layout.tsx"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-377e248246e0cf19", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/connect/page.tsx:342"}, "properties": {"repobilityId": "92edf42971abcb1d", "scanner": "scanner-primary", "fingerprint": "377e248246e0cf19", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/connect/page.tsx"}, "region": {"startLine": 342}}}]}, {"ruleId": "scanner-fde5c0ce7c43e82c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in app/api/usesession/connect-token/route.ts:11"}, "properties": {"repobilityId": "6357ae20fd8cf587", "scanner": "scanner-primary", "fingerprint": "fde5c0ce7c43e82c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/usesession/connect-token/route.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-2a0987572bba25c6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/faq/page.tsx:101"}, "properties": {"repobilityId": "a5ab68a1ec1443fc", "scanner": "scanner-primary", "fingerprint": "2a0987572bba25c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/faq/page.tsx"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-d2fbcf058a16c330", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/welcome/page.tsx:321"}, "properties": {"repobilityId": "8e915de0201fdb5c", "scanner": "scanner-primary", "fingerprint": "d2fbcf058a16c330", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/welcome/page.tsx"}, "region": {"startLine": 321}}}]}, {"ruleId": "scanner-a6d6bfba38bd2db0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/content.js:188"}, "properties": {"repobilityId": "3588cb750e9d5791", "scanner": "scanner-primary", "fingerprint": "a6d6bfba38bd2db0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "extension/content.js"}, "region": {"startLine": 188}}}]}, {"ruleId": "scanner-3bae6394523fbd3b", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in extension/content.js:229"}, "properties": {"repobilityId": "b00b657b329d2750", "scanner": "scanner-primary", "fingerprint": "3bae6394523fbd3b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "extension/content.js"}, "region": {"startLine": 229}}}]}, {"ruleId": "scanner-5fbeafc2e405bc1f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in extension/popup.js:50"}, "properties": {"repobilityId": "a00229084d796613", "scanner": "scanner-primary", "fingerprint": "5fbeafc2e405bc1f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "extension/popup.js"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6cfa8445fd9dce55", "level": "note", "message": {"text": "Very large file: app/admin/page.tsx (1655 lines)"}, "properties": {"repobilityId": "b253f5b6880faf92", "scanner": "scanner-primary", "fingerprint": "6cfa8445fd9dce55", "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": "004ee74543fc3f16", "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": "fdb49c80dab45a6a", "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": "78dad24d228c8bc5", "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": "fd9e812bc42251f6", "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": "7c4691529c5b4bee", "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": "743404e23bb0b910", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "ac3d3e4acc3e4956", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "abaccd1836acb8ad", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "71c1e9c13ca85c6c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-4b56618f0e9ba5ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/AppFrame.tsx:11"}, "properties": {"repobilityId": "cb82e342e7971365", "scanner": "scanner-primary", "fingerprint": "4b56618f0e9ba5ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5118679240b71d4c", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/SetupStatus.tsx:3"}, "properties": {"repobilityId": "0a7e67b1f330655b", "scanner": "scanner-primary", "fingerprint": "5118679240b71d4c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e0c57c18576f6e2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/CsvImport.tsx:128"}, "properties": {"repobilityId": "b5f417dec3f9fa77", "scanner": "scanner-primary", "fingerprint": "3e0c57c18576f6e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3b74d55572ddbf03", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/ConnectDemo.tsx:12"}, "properties": {"repobilityId": "4f4da6dcea152fb4", "scanner": "scanner-primary", "fingerprint": "3b74d55572ddbf03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8fee577606ec94f9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/connect/page.tsx:138"}, "properties": {"repobilityId": "688d38e8e28d50a9", "scanner": "scanner-primary", "fingerprint": "8fee577606ec94f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-377868446ab89eaf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/extract-session/route.ts:20"}, "properties": {"repobilityId": "cc2cccc369fc0c97", "scanner": "scanner-primary", "fingerprint": "377868446ab89eaf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7808627fb20b0dee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/extract-usesession/route.ts:20"}, "properties": {"repobilityId": "6a4532e27629ab60", "scanner": "scanner-primary", "fingerprint": "7808627fb20b0dee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-52d73d717a0f8c68", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/admin/users/route.ts:24"}, "properties": {"repobilityId": "cab089a3cd134ccb", "scanner": "scanner-primary", "fingerprint": "52d73d717a0f8c68", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76bfe53650bd206e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/admin/users/bulk-delete/route.ts:6"}, "properties": {"repobilityId": "5b06e2a9129056e5", "scanner": "scanner-primary", "fingerprint": "76bfe53650bd206e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55cb2b03977a1819", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/admin/migrate-emails/route.ts:5"}, "properties": {"repobilityId": "6257cee03c2c5a67", "scanner": "scanner-primary", "fingerprint": "55cb2b03977a1819", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c1920a4f51f94e0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/admin/comprehensive-analytics/route.ts:49"}, "properties": {"repobilityId": "2bc082f4243c6684", "scanner": "scanner-primary", "fingerprint": "0c1920a4f51f94e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ccee0ebbc25f90fe", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/admin/shared-sender/route.ts:14"}, "properties": {"repobilityId": "5170ba7ca27b62fa", "scanner": "scanner-primary", "fingerprint": "ccee0ebbc25f90fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6932a42f17a3387e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/twilio/inbound/route.ts:5"}, "properties": {"repobilityId": "a415ac40c99db58e", "scanner": "scanner-primary", "fingerprint": "6932a42f17a3387e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9308ea0f6e6459e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/update-user-subscription/route.ts:13"}, "properties": {"repobilityId": "c6c252ba67858a22", "scanner": "scanner-primary", "fingerprint": "b9308ea0f6e6459e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a488487b6506bc9", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/cron/route.ts:6"}, "properties": {"repobilityId": "5306f8f1d8ac8a2a", "scanner": "scanner-primary", "fingerprint": "5a488487b6506bc9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38ed86ebb571c602", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/textmagic-stats/route.ts:34"}, "properties": {"repobilityId": "8e1926ed0a519442", "scanner": "scanner-primary", "fingerprint": "38ed86ebb571c602", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-edc9ef5f042a9046", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/new/page.tsx:69"}, "properties": {"repobilityId": "ce64c37564d2740b", "scanner": "scanner-primary", "fingerprint": "edc9ef5f042a9046", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df65ac7fd9393f1f", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/payment-required/page.tsx:36"}, "properties": {"repobilityId": "2292816f1f285acc", "scanner": "scanner-primary", "fingerprint": "df65ac7fd9393f1f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01d0f70b05e6afdf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/payment-required/page.tsx:129"}, "properties": {"repobilityId": "590287a722b6f04f", "scanner": "scanner-primary", "fingerprint": "01d0f70b05e6afdf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-63fbe9c4c9f58158", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/welcome/page.tsx:196"}, "properties": {"repobilityId": "f48fdff2aa1c60e1", "scanner": "scanner-primary", "fingerprint": "63fbe9c4c9f58158", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-370bd30d2911daf4", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/turnstile.ts:3"}, "properties": {"repobilityId": "63bcfe8d79b4026f", "scanner": "scanner-primary", "fingerprint": "370bd30d2911daf4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9bb6ae9931f25dab", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/twilio.ts:1"}, "properties": {"repobilityId": "e47413cd9a3074c6", "scanner": "scanner-primary", "fingerprint": "9bb6ae9931f25dab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f9006179c58db9f", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/pairing.ts:3"}, "properties": {"repobilityId": "9af69bb1f5339847", "scanner": "scanner-primary", "fingerprint": "7f9006179c58db9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-138a8922eb7f246c", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/reminders.ts:27"}, "properties": {"repobilityId": "6c1d002d5045bca7", "scanner": "scanner-primary", "fingerprint": "138a8922eb7f246c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d1a719895da617a", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/sms.ts:1"}, "properties": {"repobilityId": "5e3e6ac474b83c5b", "scanner": "scanner-primary", "fingerprint": "3d1a719895da617a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-43dab05a3f8494f2", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/bookmarklet.ts:5"}, "properties": {"repobilityId": "63e70d20b1c22283", "scanner": "scanner-primary", "fingerprint": "43dab05a3f8494f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c74fefe82fca5ef8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/bookmarklet.ts:40"}, "properties": {"repobilityId": "63506714645725fa", "scanner": "scanner-primary", "fingerprint": "c74fefe82fca5ef8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2cbff98ed6ac94dd", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/url-guard.ts:1"}, "properties": {"repobilityId": "fa090dc85042e44e", "scanner": "scanner-primary", "fingerprint": "2cbff98ed6ac94dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd130db072f97de7", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/plans.ts:1"}, "properties": {"repobilityId": "80233f338aec2cfa", "scanner": "scanner-primary", "fingerprint": "cd130db072f97de7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a02d17b80982d32", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/usesession.ts:23"}, "properties": {"repobilityId": "a5607fd0f0618474", "scanner": "scanner-primary", "fingerprint": "0a02d17b80982d32", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-418a61ff4883c4e5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/usesession.ts:58"}, "properties": {"repobilityId": "c4ad76fbba9e05d6", "scanner": "scanner-primary", "fingerprint": "418a61ff4883c4e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6dd61d019205e44a", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/provisioning.ts:3"}, "properties": {"repobilityId": "9766f7a68f5ef70a", "scanner": "scanner-primary", "fingerprint": "6dd61d019205e44a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-979c0f8e080da0ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/settings.ts:104"}, "properties": {"repobilityId": "fa997a8315dc0c4a", "scanner": "scanner-primary", "fingerprint": "979c0f8e080da0ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2dbc8eeb4967c0f", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/usage.ts:3"}, "properties": {"repobilityId": "98fb29c01b7d581b", "scanner": "scanner-primary", "fingerprint": "d2dbc8eeb4967c0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}