{"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-8b13034141b6de27", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/glo24-godmode-e2e.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/glo24-godmode-e2e.ts:42"}, "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-f48ad54f8bd3ae82", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_tmp-glo56-verify.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_tmp-glo56-verify.ts:13"}, "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-2bf51cc9b78d1356", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_reconcile_balance.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_reconcile_balance.ts:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76f66142cbb19968", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/security-smoke.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/security-smoke.ts:15"}, "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-1476c19658d8709f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_audit_vendor.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_audit_vendor.ts:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c4eb89c83bfb9a7", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_stripe_inventory.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_stripe_inventory.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-ef229af916398451", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/glo44-e2e.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/glo44-e2e.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-0588c8c06e34289f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_reverse_vendor_transfers.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_reverse_vendor_transfers.ts:17"}, "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-4f02899247433cf4", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_test_vendor_state.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_test_vendor_state.ts:11"}, "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-c586ee04c67bf019", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_vendor_balances.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_vendor_balances.ts:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3171cb10c4f2124", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/test_refund_scenarios.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/test_refund_scenarios.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-964860b0af67e2cd", "name": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/glo58-e2e.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/glo58-e2e.ts:32"}, "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-93e9e95f4e5ce460", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:351", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:351"}, "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-06791d81729df618", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probeLicenseStorage.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probeLicenseStorage.ts:13"}, "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-795bf52e780297eb", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/listClerkInvitations.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/listClerkInvitations.ts:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c8db09c36007e13b", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testReceiptEmail.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testReceiptEmail.ts:37"}, "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-fc0d1eed8f954baf", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testTierOverride.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testTierOverride.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-955a60effaa99cde", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/resendVendorInvite.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/resendVendorInvite.ts:22"}, "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-509d348000e36189", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testDispute.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testDispute.ts:27"}, "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-9c56526c57ce8254", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/receiptWatcher.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/receiptWatcher.ts:27"}, "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-3f21d408f17baae7", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/sendReceiptAndRedeem.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/sendReceiptAndRedeem.ts:68"}, "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-41490549270d337f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testPush.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testPush.ts:17"}, "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-27e26a267f8ee21c", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testMoneySplit.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testMoneySplit.ts:33"}, "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-9a57ebd359f59062", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testLicenseFlow.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testLicenseFlow.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d9481f22dd3d5b74", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testPayoutSupportEmails.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testPayoutSupportEmails.ts:27"}, "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-dd4f887053848879", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/renderEmailPreviews.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/renderEmailPreviews.ts:35"}, "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-8b1f9437a8487da4", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testCredits.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testCredits.ts:49"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-66d2cad4f52c0af6", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/sentry.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/sentry.ts:22"}, "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-90e87a9872e2e13d", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/client.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/client.ts:28"}, "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-a5d5f3222ba1abb0", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/email.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/email.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-20d302b4c26fd49a", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/apns.ts:200", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/apns.ts:200"}, "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-395935d4385fc3aa", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/payoutWebhooks.ts:262", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/payoutWebhooks.ts:262"}, "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-7a7c57b6d9b2d551", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/creditAdmin.ts:538", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/creditAdmin.ts:538"}, "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-6f88ac178691cb9b", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/src/components/consumer/AppDownloadRibbon.tsx:14", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/components/consumer/AppDownloadRibbon.tsx:14"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3f638de53e13b007", "name": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/SettingsView.tsx:146", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/SettingsView.tsx:146"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7cf107ae07e984dc", "name": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/CreditsView.tsx:672", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/CreditsView.tsx:672"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-739b816f4d4e35d5", "name": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/TransactionsView.tsx:376", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/TransactionsView.tsx:376"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-124ec9c44f1eb051", "name": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/SupportView.tsx:536", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/SupportView.tsx:536"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa227966a3b6fc48", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/lib/jsonLd.tsx:26", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/lib/jsonLd.tsx:26"}, "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-a399b8cd27d5eaab", "name": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/TrpcProvider.tsx:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/TrpcProvider.tsx:59"}, "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-c4cd29b28dfb8d3f", "name": "Insecure pattern 'cors_wildcard' in apps/api/src/index.ts:36", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in apps/api/src/index.ts:36"}, "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-a7336b39ac1094b9", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/lib/jsonLd.tsx:26", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/lib/jsonLd.tsx:26"}, "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-567f2538bcca2a22", "name": "Insecure pattern 'direct_innerhtml_assignment' in how-it-works/index.html:286", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in how-it-works/index.html:286"}, "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-bae0cc0ad1a839e6", "name": "Very large file: apps/api/src/router/admin.router.ts (1869 lines)", "shortDescription": {"text": "Very large file: apps/api/src/router/admin.router.ts (1869 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-03a3fe6981d0c157", "name": "Very large file: apps/api/src/domain/admin.ts (1848 lines)", "shortDescription": {"text": "Very large file: apps/api/src/domain/admin.ts (1848 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-4057df23ceb85d59", "name": "Very large file: apps/api/src/domain/deals.ts (1354 lines)", "shortDescription": {"text": "Very large file: apps/api/src/domain/deals.ts (1354 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-f2fb437c167031c8", "name": "Very large file: apps/web/src/app/admin/console/CreditsView.tsx (1120 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/admin/console/CreditsView.tsx (1120 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": "10 test file(s) for 345 source file(s) (ratio 0.03). 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-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0c2205560692580", "name": "Node manifest has dependencies but no lockfile: apps/mobile/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/mobile/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-892d4f964c9036e2", "name": "Node manifest has dependencies but no lockfile: packages/api-client/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/api-client/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41b225e183229484", "name": "Node manifest has dependencies but no lockfile: packages/auth/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/auth/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50218c90b43393bb", "name": "Node manifest has dependencies but no lockfile: packages/ui/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/ui/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-db8819dd7d791552", "name": "Node manifest has dependencies but no lockfile: packages/location/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/location/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 200 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 108 placeholder/mock markers across 39 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, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "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, lockfile. 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-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-339bdae07f4c3cb9", "name": "Commented-code block (5 lines) in apps/api/src/index.ts:133", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/index.ts:133"}, "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-0a7c6f08af5a43a7", "name": "Commented-code block (5 lines) in apps/api/src/router/claims.router.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/router/claims.router.ts:47"}, "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-f94a397a354bbea2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probeLicenseStorage.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probeLicenseStorage.ts:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-361e3635b64e1bdc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/testLicenseFlow.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/testLicenseFlow.ts:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-220c7cc0f7a3a18b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/testPayoutSupportEmails.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/testPayoutSupportEmails.ts:21"}, "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-8647909b3e5f45b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/db/storage.ts:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/db/storage.ts:51"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27ef55adf62c2e9b", "name": "Commented-code block (5 lines) in apps/api/src/db/client.ts:45", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/db/client.ts:45"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60eeb1d870864ff8", "name": "Commented-code block (10 lines) in apps/api/src/domain/payouts.ts:111", "shortDescription": {"text": "Commented-code block (10 lines) in apps/api/src/domain/payouts.ts:111"}, "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-0a75f6e16fe83da2", "name": "Commented-code block (6 lines) in apps/api/src/domain/claims.ts:483", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/domain/claims.ts:483"}, "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-84818ead99b2f7c9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/domain/googleMaps.ts:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/domain/googleMaps.ts:132"}, "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-4ffc77cea4f22685", "name": "Commented-code block (6 lines) in apps/api/src/domain/deals.ts:306", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/domain/deals.ts:306"}, "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-e2e359e007d4d456", "name": "Legacy-named symbol `signup_too_old` in apps/api/src/domain/referrals.ts:121", "shortDescription": {"text": "Legacy-named symbol `signup_too_old` in apps/api/src/domain/referrals.ts:121"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-524c18632a91125b", "name": "Commented-code block (5 lines) in apps/api/src/domain/supportTickets.ts:170", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/domain/supportTickets.ts:170"}, "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-4db4679a781526bb", "name": "Commented-code block (5 lines) in apps/api/src/domain/payoutWebhooks.ts:190", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/domain/payoutWebhooks.ts:190"}, "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-3f007b61ad71c83c", "name": "Commented-code block (5 lines) in apps/mobile/app/_layout.tsx:44", "shortDescription": {"text": "Commented-code block (5 lines) in apps/mobile/app/_layout.tsx:44"}, "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-2ba2e41e0c0dc2d9", "name": "Commented-code block (5 lines) in apps/mobile/app/(app)/my-deal/[id].tsx:378", "shortDescription": {"text": "Commented-code block (5 lines) in apps/mobile/app/(app)/my-deal/[id].tsx:378"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7295c1f83dec444d", "name": "Commented-code block (5 lines) in apps/mobile/app/(app)/(tabs)/profile.tsx:376", "shortDescription": {"text": "Commented-code block (5 lines) in apps/mobile/app/(app)/(tabs)/profile.tsx:376"}, "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-2518593c451fd5f5", "name": "Commented-code block (8 lines) in apps/mobile/features/notifications/usePushRegistration.ts:28", "shortDescription": {"text": "Commented-code block (8 lines) in apps/mobile/features/notifications/usePushRegistration.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b7cdb9bac73d2f47", "name": "Commented-code block (5 lines) in apps/mobile/features/reviews/ReviewSheet.tsx:182", "shortDescription": {"text": "Commented-code block (5 lines) in apps/mobile/features/reviews/ReviewSheet.tsx:182"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4887173d70f8103e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/features/reviews/ReviewSheet.tsx:118", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/features/reviews/ReviewSheet.tsx:118"}, "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-0f92bd55644f9673", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/features/support/useSupportUpload.ts:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/features/support/useSupportUpload.ts:78"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f919690f89c9bc3", "name": "Commented-code block (5 lines) in apps/web/src/app/(consumer)/page.tsx:67", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/app/(consumer)/page.tsx:67"}, "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-76da81cf77366d2c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(consumer)/spa/[id]/page.tsx:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(consumer)/spa/[id]/page.tsx:35"}, "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-ff4f732d27d864c4", "name": "Legacy-named symbol `signup_too_old` in apps/web/src/app/(consumer)/r/[code]/ReferralLanding.tsx:33", "shortDescription": {"text": "Legacy-named symbol `signup_too_old` in apps/web/src/app/(consumer)/r/[code]/ReferralLanding.tsx:33"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-792920ebf30d46c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(consumer)/deals/[id]/page.tsx:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(consumer)/deals/[id]/page.tsx:38"}, "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-dcf38536e55be428", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/gift/[sessionId]/page.tsx:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/gift/[sessionId]/page.tsx:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5022a6228ee6e873", "name": "Commented-code block (5 lines) in packages/ui/src/BottomSheet.tsx:109", "shortDescription": {"text": "Commented-code block (5 lines) in packages/ui/src/BottomSheet.tsx:109"}, "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-a9836457f7ec50c4", "name": "23 env vars used in code but missing from .env.example", "shortDescription": {"text": "23 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `APPLE_APNS_ENDPOINT`, `APPLE_APNS_KEY_FILENAME`, `APPLE_APNS_KEY_ID`, `APPLE_BUNDLE_ID`, `APPLE_PASS_SIGNER_KEY_PASSPHRASE`, `APPLE_PASS_TYPE_ID`, `APPLE_TEAM_ID`, `CREDITS_EMAIL_HASH_SALT` + 15 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e5971238a24753e3", "name": "Dangling fetch: GET https://api.resend.com/emails/${id} (apps/api/src/scripts/testPayoutSupportEmails.ts:21)", "shortDescription": {"text": "Dangling fetch: GET https://api.resend.com/emails/${id} (apps/api/src/scripts/testPayoutSupportEmails.ts:21)"}, "fullDescription": {"text": "`apps/api/src/scripts/testPayoutSupportEmails.ts:21` calls `GET https://api.resend.com/emails/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-38e551a564502e1c", "name": "Dangling fetch: GET https://api.stripe.com/v1/checkout/sessions/${encodeURIComponent(sessionId)}?expand[]=line_items.dat", "shortDescription": {"text": "Dangling fetch: GET https://api.stripe.com/v1/checkout/sessions/${encodeURIComponent(sessionId)}?expand[]=line_items.data.price.product (apps/web/src/app/gift/[sessionId]/page.tsx:44)"}, "fullDescription": {"text": "`apps/web/src/app/gift/[sessionId]/page.tsx:44` calls `GET https://api.stripe.com/v1/checkout/sessions/${encodeURIComponent(sessionId)}?expand[]=line_items.data.price.product` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.stripe.com/v1/checkout/sessions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9be260efccadaa46", "name": "Unused endpoint: USE /trpc/*", "shortDescription": {"text": "Unused endpoint: USE /trpc/*"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /trpc/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1dfcc9529630142e", "name": "Unused endpoint: POST /webhooks/stripe", "shortDescription": {"text": "Unused endpoint: POST /webhooks/stripe"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `POST /webhooks/stripe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-56a9afe7302c3e98", "name": "Unused endpoint: GET /pass/:claimId", "shortDescription": {"text": "Unused endpoint: GET /pass/:claimId"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `GET /pass/:claimId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20790"}, "properties": {"repository": "TallyDevelopers/Gloe-Find-Local-Deals", "repoUrl": "https://github.com/TallyDevelopers/Gloe-Find-Local-Deals", "branch": "main"}, "results": [{"ruleId": "scanner-8b13034141b6de27", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/glo24-godmode-e2e.ts:42"}, "properties": {"repobilityId": "ed6c19c90ef58174", "scanner": "scanner-primary", "fingerprint": "8b13034141b6de27", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f48ad54f8bd3ae82", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_tmp-glo56-verify.ts:13"}, "properties": {"repobilityId": "a84e4bb290070a20", "scanner": "scanner-primary", "fingerprint": "f48ad54f8bd3ae82", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2bf51cc9b78d1356", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_reconcile_balance.ts:9"}, "properties": {"repobilityId": "00e341ab5c0bbfc1", "scanner": "scanner-primary", "fingerprint": "2bf51cc9b78d1356", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-76f66142cbb19968", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/security-smoke.ts:15"}, "properties": {"repobilityId": "aaf63e422b921388", "scanner": "scanner-primary", "fingerprint": "76f66142cbb19968", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1476c19658d8709f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_audit_vendor.ts:9"}, "properties": {"repobilityId": "62f34998cc7e4d95", "scanner": "scanner-primary", "fingerprint": "1476c19658d8709f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8c4eb89c83bfb9a7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_stripe_inventory.ts:25"}, "properties": {"repobilityId": "a5619ea331e0cdc7", "scanner": "scanner-primary", "fingerprint": "8c4eb89c83bfb9a7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef229af916398451", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/glo44-e2e.ts:25"}, "properties": {"repobilityId": "53d5b68fb4c9d2ec", "scanner": "scanner-primary", "fingerprint": "ef229af916398451", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0588c8c06e34289f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_reverse_vendor_transfers.ts:17"}, "properties": {"repobilityId": "dc340a7ca76f0757", "scanner": "scanner-primary", "fingerprint": "0588c8c06e34289f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4f02899247433cf4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_test_vendor_state.ts:11"}, "properties": {"repobilityId": "c17ac08f3369c838", "scanner": "scanner-primary", "fingerprint": "4f02899247433cf4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c586ee04c67bf019", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/_vendor_balances.ts:8"}, "properties": {"repobilityId": "23fccef7087f3264", "scanner": "scanner-primary", "fingerprint": "c586ee04c67bf019", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a3171cb10c4f2124", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/test_refund_scenarios.ts:31"}, "properties": {"repobilityId": "e5c4517018cb019f", "scanner": "scanner-primary", "fingerprint": "a3171cb10c4f2124", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-964860b0af67e2cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/scripts/glo58-e2e.ts:32"}, "properties": {"repobilityId": "027e25c1ad9aa381", "scanner": "scanner-primary", "fingerprint": "964860b0af67e2cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-93e9e95f4e5ce460", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:351"}, "properties": {"repobilityId": "a178156af585d748", "scanner": "scanner-primary", "fingerprint": "93e9e95f4e5ce460", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06791d81729df618", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/probeLicenseStorage.ts:13"}, "properties": {"repobilityId": "ff43a12a8f30548f", "scanner": "scanner-primary", "fingerprint": "06791d81729df618", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-795bf52e780297eb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/listClerkInvitations.ts:8"}, "properties": {"repobilityId": "53d43ab9c369d0f2", "scanner": "scanner-primary", "fingerprint": "795bf52e780297eb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c8db09c36007e13b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testReceiptEmail.ts:37"}, "properties": {"repobilityId": "7f7ef303838bf02b", "scanner": "scanner-primary", "fingerprint": "c8db09c36007e13b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc0d1eed8f954baf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testTierOverride.ts:29"}, "properties": {"repobilityId": "b3a8b987cf0d41ac", "scanner": "scanner-primary", "fingerprint": "fc0d1eed8f954baf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-955a60effaa99cde", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/resendVendorInvite.ts:22"}, "properties": {"repobilityId": "ec12a04eee2cb7b4", "scanner": "scanner-primary", "fingerprint": "955a60effaa99cde", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-509d348000e36189", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testDispute.ts:27"}, "properties": {"repobilityId": "a23eb53437a9bc99", "scanner": "scanner-primary", "fingerprint": "509d348000e36189", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c56526c57ce8254", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/receiptWatcher.ts:27"}, "properties": {"repobilityId": "66c4c69643e9614e", "scanner": "scanner-primary", "fingerprint": "9c56526c57ce8254", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f21d408f17baae7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/sendReceiptAndRedeem.ts:68"}, "properties": {"repobilityId": "e1b97a2522862cd9", "scanner": "scanner-primary", "fingerprint": "3f21d408f17baae7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-41490549270d337f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testPush.ts:17"}, "properties": {"repobilityId": "17aedfb9fa363bd8", "scanner": "scanner-primary", "fingerprint": "41490549270d337f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-27e26a267f8ee21c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testMoneySplit.ts:33"}, "properties": {"repobilityId": "8ff3ddba75cb5c26", "scanner": "scanner-primary", "fingerprint": "27e26a267f8ee21c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a57ebd359f59062", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testLicenseFlow.ts:26"}, "properties": {"repobilityId": "e65eecad0e055f02", "scanner": "scanner-primary", "fingerprint": "9a57ebd359f59062", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d9481f22dd3d5b74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testPayoutSupportEmails.ts:27"}, "properties": {"repobilityId": "a0f0cef90bc42b87", "scanner": "scanner-primary", "fingerprint": "d9481f22dd3d5b74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd4f887053848879", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/renderEmailPreviews.ts:35"}, "properties": {"repobilityId": "d4a1fe3230e3c7a0", "scanner": "scanner-primary", "fingerprint": "dd4f887053848879", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8b1f9437a8487da4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/scripts/testCredits.ts:49"}, "properties": {"repobilityId": "3921af4c4a421178", "scanner": "scanner-primary", "fingerprint": "8b1f9437a8487da4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-66d2cad4f52c0af6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/lib/sentry.ts:22"}, "properties": {"repobilityId": "451feb95e41d5939", "scanner": "scanner-primary", "fingerprint": "66d2cad4f52c0af6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-90e87a9872e2e13d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/db/client.ts:28"}, "properties": {"repobilityId": "af85d5e78068905e", "scanner": "scanner-primary", "fingerprint": "90e87a9872e2e13d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a5d5f3222ba1abb0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/email.ts:48"}, "properties": {"repobilityId": "5ec8ccfe7ee41966", "scanner": "scanner-primary", "fingerprint": "a5d5f3222ba1abb0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20d302b4c26fd49a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/apns.ts:200"}, "properties": {"repobilityId": "4e8297a955dfac34", "scanner": "scanner-primary", "fingerprint": "20d302b4c26fd49a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-395935d4385fc3aa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/payoutWebhooks.ts:262"}, "properties": {"repobilityId": "84a4f8f85ed67d20", "scanner": "scanner-primary", "fingerprint": "395935d4385fc3aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7a7c57b6d9b2d551", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/domain/creditAdmin.ts:538"}, "properties": {"repobilityId": "5fbae0cf44469f9b", "scanner": "scanner-primary", "fingerprint": "7a7c57b6d9b2d551", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6f88ac178691cb9b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/components/consumer/AppDownloadRibbon.tsx:14"}, "properties": {"repobilityId": "05225822e8f0e92d", "scanner": "scanner-primary", "fingerprint": "6f88ac178691cb9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3f638de53e13b007", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/SettingsView.tsx:146"}, "properties": {"repobilityId": "ea75fa268e7cb0ee", "scanner": "scanner-primary", "fingerprint": "3f638de53e13b007", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7cf107ae07e984dc", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/CreditsView.tsx:672"}, "properties": {"repobilityId": "833c33f99167f2a4", "scanner": "scanner-primary", "fingerprint": "7cf107ae07e984dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-739b816f4d4e35d5", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/TransactionsView.tsx:376"}, "properties": {"repobilityId": "4e8ad7834b884a75", "scanner": "scanner-primary", "fingerprint": "739b816f4d4e35d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-124ec9c44f1eb051", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/src/app/admin/console/SupportView.tsx:536"}, "properties": {"repobilityId": "3eec107e01ef335d", "scanner": "scanner-primary", "fingerprint": "124ec9c44f1eb051", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-aa227966a3b6fc48", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/lib/jsonLd.tsx:26"}, "properties": {"repobilityId": "05069dad08441261", "scanner": "scanner-primary", "fingerprint": "aa227966a3b6fc48", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a399b8cd27d5eaab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/TrpcProvider.tsx:59"}, "properties": {"repobilityId": "ed5ca603914b7d83", "scanner": "scanner-primary", "fingerprint": "a399b8cd27d5eaab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c4cd29b28dfb8d3f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in apps/api/src/index.ts:36"}, "properties": {"repobilityId": "3ca37d88226c999f", "scanner": "scanner-primary", "fingerprint": "c4cd29b28dfb8d3f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/index.ts"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-a7336b39ac1094b9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/lib/jsonLd.tsx:26"}, "properties": {"repobilityId": "2dbc80df13b3d2a4", "scanner": "scanner-primary", "fingerprint": "a7336b39ac1094b9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/lib/jsonLd.tsx"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-567f2538bcca2a22", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in how-it-works/index.html:286"}, "properties": {"repobilityId": "c070b029dfe282fe", "scanner": "scanner-primary", "fingerprint": "567f2538bcca2a22", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "how-it-works/index.html"}, "region": {"startLine": 286}}}]}, {"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-bae0cc0ad1a839e6", "level": "note", "message": {"text": "Very large file: apps/api/src/router/admin.router.ts (1869 lines)"}, "properties": {"repobilityId": "36cbf0b611615a09", "scanner": "scanner-primary", "fingerprint": "bae0cc0ad1a839e6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-03a3fe6981d0c157", "level": "note", "message": {"text": "Very large file: apps/api/src/domain/admin.ts (1848 lines)"}, "properties": {"repobilityId": "c82ba6d9920d8e6c", "scanner": "scanner-primary", "fingerprint": "03a3fe6981d0c157", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4057df23ceb85d59", "level": "note", "message": {"text": "Very large file: apps/api/src/domain/deals.ts (1354 lines)"}, "properties": {"repobilityId": "2c13a29020755703", "scanner": "scanner-primary", "fingerprint": "4057df23ceb85d59", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f2fb437c167031c8", "level": "note", "message": {"text": "Very large file: apps/web/src/app/admin/console/CreditsView.tsx (1120 lines)"}, "properties": {"repobilityId": "da5343ca8de55ed3", "scanner": "scanner-primary", "fingerprint": "f2fb437c167031c8", "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": "3314b14a9d5d26b6", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d0c2205560692580", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/mobile/package.json"}, "properties": {"repobilityId": "b3dfed7bb3d70ed3", "scanner": "scanner-primary", "fingerprint": "d0c2205560692580", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/mobile/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-892d4f964c9036e2", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/api-client/package.json"}, "properties": {"repobilityId": "e1c2e42c288c295a", "scanner": "scanner-primary", "fingerprint": "892d4f964c9036e2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/api-client/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-41b225e183229484", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/auth/package.json"}, "properties": {"repobilityId": "c022328d0892fb4d", "scanner": "scanner-primary", "fingerprint": "41b225e183229484", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/auth/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-50218c90b43393bb", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/ui/package.json"}, "properties": {"repobilityId": "637e26a8c754e81d", "scanner": "scanner-primary", "fingerprint": "50218c90b43393bb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ui/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-db8819dd7d791552", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/location/package.json"}, "properties": {"repobilityId": "f39578468e682823", "scanner": "scanner-primary", "fingerprint": "db8819dd7d791552", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/location/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "53aa9669ebfc7ac4", "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": "ce62f398f5fa1095", "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": "595c80f32e60d2a5", "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": "fa3a49718e3b554c", "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": "b1153e45299b5ae7", "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": "8daf225ae031cb6d", "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": "efeeba2ae853c2b9", "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": "45bae82f2d6d84a9", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-339bdae07f4c3cb9", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/index.ts:133"}, "properties": {"repobilityId": "5907c66e6479bf3a", "scanner": "scanner-primary", "fingerprint": "339bdae07f4c3cb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a7c6f08af5a43a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/router/claims.router.ts:47"}, "properties": {"repobilityId": "2cde76b1459cdd33", "scanner": "scanner-primary", "fingerprint": "0a7c6f08af5a43a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f94a397a354bbea2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/probeLicenseStorage.ts:22"}, "properties": {"repobilityId": "a9f5158d2144eb3f", "scanner": "scanner-primary", "fingerprint": "f94a397a354bbea2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-361e3635b64e1bdc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/testLicenseFlow.ts:48"}, "properties": {"repobilityId": "1272f05611920156", "scanner": "scanner-primary", "fingerprint": "361e3635b64e1bdc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-220c7cc0f7a3a18b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/scripts/testPayoutSupportEmails.ts:21"}, "properties": {"repobilityId": "b81cf1bada4ca032", "scanner": "scanner-primary", "fingerprint": "220c7cc0f7a3a18b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8647909b3e5f45b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/db/storage.ts:51"}, "properties": {"repobilityId": "685f8f6ae7ce7191", "scanner": "scanner-primary", "fingerprint": "8647909b3e5f45b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-27ef55adf62c2e9b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/db/client.ts:45"}, "properties": {"repobilityId": "a85e8ebf8ac0db3c", "scanner": "scanner-primary", "fingerprint": "27ef55adf62c2e9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60eeb1d870864ff8", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/api/src/domain/payouts.ts:111"}, "properties": {"repobilityId": "6912bf4e81dab1e5", "scanner": "scanner-primary", "fingerprint": "60eeb1d870864ff8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a75f6e16fe83da2", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/domain/claims.ts:483"}, "properties": {"repobilityId": "8655feac8f59cc20", "scanner": "scanner-primary", "fingerprint": "0a75f6e16fe83da2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84818ead99b2f7c9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/domain/googleMaps.ts:132"}, "properties": {"repobilityId": "ede4d6702ca08aea", "scanner": "scanner-primary", "fingerprint": "84818ead99b2f7c9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4ffc77cea4f22685", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/domain/deals.ts:306"}, "properties": {"repobilityId": "4465e2b2f5fd1eb7", "scanner": "scanner-primary", "fingerprint": "4ffc77cea4f22685", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2e359e007d4d456", "level": "note", "message": {"text": "Legacy-named symbol `signup_too_old` in apps/api/src/domain/referrals.ts:121"}, "properties": {"repobilityId": "5edee4ca31512c81", "scanner": "scanner-primary", "fingerprint": "e2e359e007d4d456", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-524c18632a91125b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/domain/supportTickets.ts:170"}, "properties": {"repobilityId": "45ce9522948dea4b", "scanner": "scanner-primary", "fingerprint": "524c18632a91125b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4db4679a781526bb", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/domain/payoutWebhooks.ts:190"}, "properties": {"repobilityId": "983e0e475c8fa1ae", "scanner": "scanner-primary", "fingerprint": "4db4679a781526bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f007b61ad71c83c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/mobile/app/_layout.tsx:44"}, "properties": {"repobilityId": "085567d30cbcaf6f", "scanner": "scanner-primary", "fingerprint": "3f007b61ad71c83c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ba2e41e0c0dc2d9", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/mobile/app/(app)/my-deal/[id].tsx:378"}, "properties": {"repobilityId": "879862949c68efca", "scanner": "scanner-primary", "fingerprint": "2ba2e41e0c0dc2d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7295c1f83dec444d", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/mobile/app/(app)/(tabs)/profile.tsx:376"}, "properties": {"repobilityId": "8117c1fd54287b96", "scanner": "scanner-primary", "fingerprint": "7295c1f83dec444d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2518593c451fd5f5", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/mobile/features/notifications/usePushRegistration.ts:28"}, "properties": {"repobilityId": "cc1d01409ac56b7e", "scanner": "scanner-primary", "fingerprint": "2518593c451fd5f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7cdb9bac73d2f47", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/mobile/features/reviews/ReviewSheet.tsx:182"}, "properties": {"repobilityId": "2818930a4197fce9", "scanner": "scanner-primary", "fingerprint": "b7cdb9bac73d2f47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4887173d70f8103e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/features/reviews/ReviewSheet.tsx:118"}, "properties": {"repobilityId": "6f3e901971355ba8", "scanner": "scanner-primary", "fingerprint": "4887173d70f8103e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f92bd55644f9673", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/features/support/useSupportUpload.ts:78"}, "properties": {"repobilityId": "ed6f4898089b0d74", "scanner": "scanner-primary", "fingerprint": "0f92bd55644f9673", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f919690f89c9bc3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/app/(consumer)/page.tsx:67"}, "properties": {"repobilityId": "6e7bc84d24d5cd6a", "scanner": "scanner-primary", "fingerprint": "7f919690f89c9bc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76da81cf77366d2c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(consumer)/spa/[id]/page.tsx:35"}, "properties": {"repobilityId": "6b78c4abfbabb6fc", "scanner": "scanner-primary", "fingerprint": "76da81cf77366d2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff4f732d27d864c4", "level": "note", "message": {"text": "Legacy-named symbol `signup_too_old` in apps/web/src/app/(consumer)/r/[code]/ReferralLanding.tsx:33"}, "properties": {"repobilityId": "ce6e0e5a91c4db78", "scanner": "scanner-primary", "fingerprint": "ff4f732d27d864c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-792920ebf30d46c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(consumer)/deals/[id]/page.tsx:38"}, "properties": {"repobilityId": "70ed10ec65f1685f", "scanner": "scanner-primary", "fingerprint": "792920ebf30d46c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dcf38536e55be428", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/gift/[sessionId]/page.tsx:44"}, "properties": {"repobilityId": "11a3cf0f24a8902a", "scanner": "scanner-primary", "fingerprint": "dcf38536e55be428", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5022a6228ee6e873", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/ui/src/BottomSheet.tsx:109"}, "properties": {"repobilityId": "abd41c72cc58d386", "scanner": "scanner-primary", "fingerprint": "5022a6228ee6e873", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9836457f7ec50c4", "level": "note", "message": {"text": "23 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "71ec3608d30f8bcd", "scanner": "scanner-primary", "fingerprint": "a9836457f7ec50c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-e5971238a24753e3", "level": "error", "message": {"text": "Dangling fetch: GET https://api.resend.com/emails/${id} (apps/api/src/scripts/testPayoutSupportEmails.ts:21)"}, "properties": {"repobilityId": "8ad7ca1c966256f6", "scanner": "scanner-primary", "fingerprint": "e5971238a24753e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-38e551a564502e1c", "level": "error", "message": {"text": "Dangling fetch: GET https://api.stripe.com/v1/checkout/sessions/${encodeURIComponent(sessionId)}?expand[]=line_items.data.price.product (apps/web/src/app/gift/[sessionId]/page.tsx:44)"}, "properties": {"repobilityId": "c8bd0ba1215a9a9b", "scanner": "scanner-primary", "fingerprint": "38e551a564502e1c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "c6e42631df98c44d", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9be260efccadaa46", "level": "note", "message": {"text": "Unused endpoint: USE /trpc/*"}, "properties": {"repobilityId": "088e1f5f971d01b6", "scanner": "scanner-primary", "fingerprint": "9be260efccadaa46", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1dfcc9529630142e", "level": "note", "message": {"text": "Unused endpoint: POST /webhooks/stripe"}, "properties": {"repobilityId": "36b40d288901f88f", "scanner": "scanner-primary", "fingerprint": "1dfcc9529630142e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-56a9afe7302c3e98", "level": "note", "message": {"text": "Unused endpoint: GET /pass/:claimId"}, "properties": {"repobilityId": "03f391c7933d9921", "scanner": "scanner-primary", "fingerprint": "56a9afe7302c3e98", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}