{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04b437ddf21f6580", "name": "Stray `console.log` in TS/JS \u2014 functions/src/index.ts:576", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/index.ts:576"}, "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-36ba32e3420729f7", "name": "Stray `console.log` in TS/JS \u2014 scripts/send-welcome-to-all.js:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/send-welcome-to-all.js:127"}, "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-508ee22942960482", "name": "Stray `console.log` in TS/JS \u2014 scripts/redistribute-strict.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/redistribute-strict.js:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e68fa20bcc61686", "name": "Stray `console.log` in TS/JS \u2014 scripts/redistribute-leads.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/redistribute-leads.js:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b360e28e24629ffc", "name": "Stray `console.log` in TS/JS \u2014 scripts/nuke-data.js:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/nuke-data.js:86"}, "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-b9e912d5e84900c6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/RejectedTable.tsx:387", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/RejectedTable.tsx:387"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-664b1e31aa566a00", "name": "`truncate` class without `title=` for hover reveal \u2014 components/LiveStats.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/LiveStats.tsx:170"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d6ae5ab22d283e60", "name": "Stray `console.log` in TS/JS \u2014 components/LiveStats.tsx:145", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/LiveStats.tsx:145"}, "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-b0ac960930b867bf", "name": "Stray `console.log` in TS/JS \u2014 components/BostaExport.tsx:136", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/BostaExport.tsx:136"}, "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-b1bd9a3d262257e6", "name": "`truncate` class without `title=` for hover reveal \u2014 components/SmartNotificationSystem.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SmartNotificationSystem.tsx:232"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c51ab1d7f3cb41cb", "name": "Icon-only button without accessible name \u2014 components/StockManagement.tsx:1468", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/StockManagement.tsx:1468"}, "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-269c3b9b6ee3a013", "name": "`truncate` class without `title=` for hover reveal \u2014 components/StockManagement.tsx:737", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/StockManagement.tsx:737"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-08218878efceea39", "name": "Stray `console.log` in TS/JS \u2014 components/StockManagement.tsx:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/StockManagement.tsx:131"}, "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-b5c65d7e6b0b182c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/WhatsAppInbox.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/WhatsAppInbox.tsx:183"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-764ce9f216d68631", "name": "Stray `console.log` in TS/JS \u2014 components/WhatsAppInbox.tsx:835", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 components/WhatsAppInbox.tsx:835"}, "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-88c5cdc596ff1f1f", "name": "Icon-only button without accessible name \u2014 components/QuickRepliesBar.tsx:112", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/QuickRepliesBar.tsx:112"}, "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-926d71316766a385", "name": "`truncate` class without `title=` for hover reveal \u2014 components/OrdersTable.tsx:882", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/OrdersTable.tsx:882"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e604efc0f2bef5d", "name": "Icon-only button without accessible name \u2014 components/stock/modals/DamageModal.tsx:97", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/stock/modals/DamageModal.tsx:97"}, "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-3461da2e1a6b4d97", "name": "Icon-only button without accessible name \u2014 components/stock/modals/AddProductModal.tsx:46", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/stock/modals/AddProductModal.tsx:46"}, "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-7557e0162ed04dfd", "name": "Icon-only button without accessible name \u2014 components/stock/modals/ReturnModal.tsx:79", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/stock/modals/ReturnModal.tsx:79"}, "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-72aea58e2d9eadb5", "name": "Stray `console.log` in TS/JS \u2014 lib/firestoreService.ts:823", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/firestoreService.ts:823"}, "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-fd3b9d2ff0e27261", "name": "Stray `console.log` in TS/JS \u2014 lib/textCleaner.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/textCleaner.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-d416774e2fa986ed", "name": "Stray `console.log` in TS/JS \u2014 lib/notificationSounds.ts:402", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/notificationSounds.ts:402"}, "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-73730413eb31e003", "name": "Stray `console.log` in TS/JS \u2014 lib/phoneFormatter.ts:511", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/phoneFormatter.ts:511"}, "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-03fd715d6e5ad089", "name": "Stray `console.log` in TS/JS \u2014 lib/firebaseAdmin.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/firebaseAdmin.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f3da9a538d233038", "name": "Stray `console.log` in TS/JS \u2014 lib/bosta.ts:291", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/bosta.ts:291"}, "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-68afcc446fa67111", "name": "Stray `console.log` in TS/JS \u2014 lib/aiAutoReply.ts:175", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/aiAutoReply.ts:175"}, "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-3dc47c0af1c73f2e", "name": "Stray `console.log` in TS/JS \u2014 lib/whatsappAutomation.ts:188", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/whatsappAutomation.ts:188"}, "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-cf1ab32382a201ca", "name": "Stray `console.log` in TS/JS \u2014 lib/whatsappCloudService.ts:219", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/whatsappCloudService.ts:219"}, "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-77c2d46c6cb1bb0c", "name": "Stray `console.log` in TS/JS \u2014 pages/login.tsx:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/login.tsx: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-d8f631cd441ccf32", "name": "Stray `console.log` in TS/JS \u2014 pages/index.tsx:259", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/index.tsx:259"}, "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-1950d1932a9083ea", "name": "Stray `console.log` in TS/JS \u2014 pages/api/bosta-sync.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/bosta-sync.ts:86"}, "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-b0f49e8d08f599e7", "name": "Stray `console.log` in TS/JS \u2014 pages/api/bosta.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/bosta.ts:79"}, "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-8042d08ba9c4bf3a", "name": "Stray `console.log` in TS/JS \u2014 pages/api/orders.ts:284", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/orders.ts:284"}, "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-cdd074f81a4cb72a", "name": "Stray `console.log` in TS/JS \u2014 pages/api/bosta-ranking.ts:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/bosta-ranking.ts:116"}, "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-ee9c6f07da4d1b13", "name": "Stray `console.log` in TS/JS \u2014 pages/api/reassign.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/reassign.ts:57"}, "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-2db2f271ab6e2513", "name": "Stray `console.log` in TS/JS \u2014 pages/api/bosta-webhook.ts:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/bosta-webhook.ts:47"}, "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-e496c3544275aa3a", "name": "Stray `console.log` in TS/JS \u2014 pages/api/sync/smart-engine.ts:182", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/sync/smart-engine.ts:182"}, "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-5089e988051b3f70", "name": "Stray `console.log` in TS/JS \u2014 pages/api/ai/correct-new-leads.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/ai/correct-new-leads.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-a253bb78baa48775", "name": "Stray `console.log` in TS/JS \u2014 pages/api/auth/login.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/auth/login.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-817e79651956454d", "name": "Stray `console.log` in TS/JS \u2014 pages/api/webhook/new-lead.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/webhook/new-lead.ts:111"}, "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-893bc7a301364421", "name": "Stray `console.log` in TS/JS \u2014 pages/api/admin/cleanup-firestore.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/admin/cleanup-firestore.ts:50"}, "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-f9fd41859497f1cb", "name": "Stray `console.log` in TS/JS \u2014 pages/api/admin/migrate-data.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/admin/migrate-data.ts:55"}, "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-06296bb80069fea7", "name": "Stray `console.log` in TS/JS \u2014 pages/api/whatsapp/reply.ts:115", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/whatsapp/reply.ts:115"}, "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-ea8f6134527655f6", "name": "Stray `console.log` in TS/JS \u2014 pages/api/whatsapp/webhook.ts:187", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/whatsapp/webhook.ts:187"}, "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-7e04939cfb62576a", "name": "Stray `console.log` in TS/JS \u2014 pages/api/whatsapp/send-media.ts:186", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/whatsapp/send-media.ts:186"}, "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-f019f2eb5b100c0d", "name": "Stray `console.log` in TS/JS \u2014 hooks/useOrderNotifications.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 hooks/useOrderNotifications.ts:93"}, "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-b33232200f844fcc", "name": "Stray `console.log` in TS/JS \u2014 hooks/useFirestoreOrders.ts:174", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 hooks/useFirestoreOrders.ts:174"}, "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-807de0352624c982", "name": "Stray `console.log` in TS/JS \u2014 hooks/useSmartNotifications.ts:417", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 hooks/useSmartNotifications.ts:417"}, "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-77a464701f01cedf", "name": "Possible secret in README.md", "shortDescription": {"text": "Possible secret in README.md"}, "fullDescription": {"text": "Detected pattern matching private_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e282c090fe34887b", "name": "Insecure pattern 'private_key_in_repo' in README.md:104", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in README.md:104"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e9681e09589d14a7", "name": "Possible secret in pages/api/auth/login.ts", "shortDescription": {"text": "Possible secret in pages/api/auth/login.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-bd1bed170d24952d", "name": "Insecure pattern 'local_storage_auth_token' in hooks/useCurrentUser.ts:109", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in hooks/useCurrentUser.ts:109"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-45f90e9b0859d98b", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-java@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6e261099ac31d460", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-java@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-08d540c05cf66e5f", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9acad008f726f0f2", "name": "Very large file: components/WhatsAppAutomation.tsx (1050 lines)", "shortDescription": {"text": "Very large file: components/WhatsAppAutomation.tsx (1050 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-de20f18aa11e659f", "name": "Very large file: components/StockManagement.tsx (3383 lines)", "shortDescription": {"text": "Very large file: components/StockManagement.tsx (3383 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-5e013386dd9a64b1", "name": "Very large file: components/WhatsAppInbox.tsx (1282 lines)", "shortDescription": {"text": "Very large file: components/WhatsAppInbox.tsx (1282 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-778b5a70fa0c1564", "name": "Very large file: components/OrderEditModal.tsx (1343 lines)", "shortDescription": {"text": "Very large file: components/OrderEditModal.tsx (1343 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-08af5f22041907c1", "name": "Very large file: components/OrdersTable.tsx (1785 lines)", "shortDescription": {"text": "Very large file: components/OrdersTable.tsx (1785 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-3395218f2561fe84", "name": "Very large file: lib/firestoreService.ts (1539 lines)", "shortDescription": {"text": "Very large file: lib/firestoreService.ts (1539 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-80b299f4f4a030fa", "name": "Very large file: pages/api/sync/smart-engine.ts (1052 lines)", "shortDescription": {"text": "Very large file: pages/api/sync/smart-engine.ts (1052 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": "0 test file(s) for 126 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 313 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 86 placeholder/mock markers across 15 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "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, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7dafa2b805297c0c", "name": "Legacy-named symbol `order_confirmed_v2` in functions/src/index.ts:126", "shortDescription": {"text": "Legacy-named symbol `order_confirmed_v2` in functions/src/index.ts:126"}, "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-d3232b8798d6f9a7", "name": "Commented-code block (5 lines) in functions/src/index.ts:639", "shortDescription": {"text": "Commented-code block (5 lines) in functions/src/index.ts:639"}, "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-40dec7aed47f252b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/send-welcome-to-all.js:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/send-welcome-to-all.js:109"}, "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-a042b5ea0f57804a", "name": "Commented-code block (5 lines) in components/StockManagement.tsx:129", "shortDescription": {"text": "Commented-code block (5 lines) in components/StockManagement.tsx:129"}, "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-6a668fe43b27d3be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/stock/types.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/stock/types.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-cb9b4145065f08c5", "name": "Commented-code block (5 lines) in lib/aiAddress.ts:121", "shortDescription": {"text": "Commented-code block (5 lines) in lib/aiAddress.ts:121"}, "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-2e2a1664c922d634", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/aiProvider.ts:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/aiProvider.ts:5"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cdad519ab720c621", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/authFetch.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/authFetch.ts:34"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f96ad7b6074e024d", "name": "Legacy-named symbol `order_confirmed_v2` in lib/whatsappCloudService.ts:682", "shortDescription": {"text": "Legacy-named symbol `order_confirmed_v2` in lib/whatsappCloudService.ts:682"}, "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-59abf0975e3a91a3", "name": "Commented-code block (5 lines) in pages/api/whatsapp/webhook.ts:146", "shortDescription": {"text": "Commented-code block (5 lines) in pages/api/whatsapp/webhook.ts:146"}, "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-274418b035fefb70", "name": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/whatsapp/webhook.ts:519", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/whatsapp/webhook.ts:519"}, "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-a4e42ebbef7a8d16", "name": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/whatsapp/send-media.ts:164", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/whatsapp/send-media.ts:164"}, "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}}]}}, "automationDetails": {"id": "repobility/20858"}, "properties": {"repository": "taysirco/crm", "repoUrl": "https://github.com/taysirco/crm", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-04b437ddf21f6580", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 functions/src/index.ts:576"}, "properties": {"repobilityId": "afe001e09fb2bddf", "scanner": "scanner-primary", "fingerprint": "04b437ddf21f6580", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36ba32e3420729f7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/send-welcome-to-all.js:127"}, "properties": {"repobilityId": "1a048e5cd1a5960c", "scanner": "scanner-primary", "fingerprint": "36ba32e3420729f7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-508ee22942960482", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/redistribute-strict.js:20"}, "properties": {"repobilityId": "9fb9ae56a70eaf37", "scanner": "scanner-primary", "fingerprint": "508ee22942960482", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e68fa20bcc61686", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/redistribute-leads.js:20"}, "properties": {"repobilityId": "ec2ec8c6a019f05f", "scanner": "scanner-primary", "fingerprint": "4e68fa20bcc61686", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b360e28e24629ffc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/nuke-data.js:86"}, "properties": {"repobilityId": "3c4cccf4eba34e4c", "scanner": "scanner-primary", "fingerprint": "b360e28e24629ffc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b9e912d5e84900c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/RejectedTable.tsx:387"}, "properties": {"repobilityId": "9067b1d1d24544ba", "scanner": "scanner-primary", "fingerprint": "b9e912d5e84900c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-664b1e31aa566a00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/LiveStats.tsx:170"}, "properties": {"repobilityId": "a4df8de48acb3169", "scanner": "scanner-primary", "fingerprint": "664b1e31aa566a00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6ae5ab22d283e60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/LiveStats.tsx:145"}, "properties": {"repobilityId": "646134481207d5ba", "scanner": "scanner-primary", "fingerprint": "d6ae5ab22d283e60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b0ac960930b867bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/BostaExport.tsx:136"}, "properties": {"repobilityId": "1949bee21fa392dc", "scanner": "scanner-primary", "fingerprint": "b0ac960930b867bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b1bd9a3d262257e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SmartNotificationSystem.tsx:232"}, "properties": {"repobilityId": "f981068847e6edee", "scanner": "scanner-primary", "fingerprint": "b1bd9a3d262257e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c51ab1d7f3cb41cb", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/StockManagement.tsx:1468"}, "properties": {"repobilityId": "11382b68d157cf86", "scanner": "scanner-primary", "fingerprint": "c51ab1d7f3cb41cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-269c3b9b6ee3a013", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/StockManagement.tsx:737"}, "properties": {"repobilityId": "036abe9aa745531b", "scanner": "scanner-primary", "fingerprint": "269c3b9b6ee3a013", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-08218878efceea39", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/StockManagement.tsx:131"}, "properties": {"repobilityId": "45cc45f4d562a516", "scanner": "scanner-primary", "fingerprint": "08218878efceea39", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5c65d7e6b0b182c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/WhatsAppInbox.tsx:183"}, "properties": {"repobilityId": "ea2c88e3f9bfd755", "scanner": "scanner-primary", "fingerprint": "b5c65d7e6b0b182c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-764ce9f216d68631", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 components/WhatsAppInbox.tsx:835"}, "properties": {"repobilityId": "e2f0b32d20b74c2b", "scanner": "scanner-primary", "fingerprint": "764ce9f216d68631", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-88c5cdc596ff1f1f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/QuickRepliesBar.tsx:112"}, "properties": {"repobilityId": "8ba52b8e077e3023", "scanner": "scanner-primary", "fingerprint": "88c5cdc596ff1f1f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-926d71316766a385", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/OrdersTable.tsx:882"}, "properties": {"repobilityId": "c983e78132885e68", "scanner": "scanner-primary", "fingerprint": "926d71316766a385", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e604efc0f2bef5d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/stock/modals/DamageModal.tsx:97"}, "properties": {"repobilityId": "4d641428bdebb3a7", "scanner": "scanner-primary", "fingerprint": "6e604efc0f2bef5d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3461da2e1a6b4d97", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/stock/modals/AddProductModal.tsx:46"}, "properties": {"repobilityId": "83d65ca351735a12", "scanner": "scanner-primary", "fingerprint": "3461da2e1a6b4d97", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7557e0162ed04dfd", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/stock/modals/ReturnModal.tsx:79"}, "properties": {"repobilityId": "bc75ae7f6ae48424", "scanner": "scanner-primary", "fingerprint": "7557e0162ed04dfd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-72aea58e2d9eadb5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/firestoreService.ts:823"}, "properties": {"repobilityId": "1d278e2bf7ccf9f9", "scanner": "scanner-primary", "fingerprint": "72aea58e2d9eadb5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fd3b9d2ff0e27261", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/textCleaner.ts:42"}, "properties": {"repobilityId": "7ac68babf2c48961", "scanner": "scanner-primary", "fingerprint": "fd3b9d2ff0e27261", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d416774e2fa986ed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/notificationSounds.ts:402"}, "properties": {"repobilityId": "3e1902cd403df7b9", "scanner": "scanner-primary", "fingerprint": "d416774e2fa986ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-73730413eb31e003", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/phoneFormatter.ts:511"}, "properties": {"repobilityId": "2d3583b24f40ecd2", "scanner": "scanner-primary", "fingerprint": "73730413eb31e003", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-03fd715d6e5ad089", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/firebaseAdmin.ts:34"}, "properties": {"repobilityId": "fc79ea249346e051", "scanner": "scanner-primary", "fingerprint": "03fd715d6e5ad089", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f3da9a538d233038", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/bosta.ts:291"}, "properties": {"repobilityId": "5188f322c1dda4a3", "scanner": "scanner-primary", "fingerprint": "f3da9a538d233038", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68afcc446fa67111", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/aiAutoReply.ts:175"}, "properties": {"repobilityId": "3f5cf076b8d26bcf", "scanner": "scanner-primary", "fingerprint": "68afcc446fa67111", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3dc47c0af1c73f2e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/whatsappAutomation.ts:188"}, "properties": {"repobilityId": "a02f283b729252c6", "scanner": "scanner-primary", "fingerprint": "3dc47c0af1c73f2e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf1ab32382a201ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/whatsappCloudService.ts:219"}, "properties": {"repobilityId": "e76498f04c58b5ee", "scanner": "scanner-primary", "fingerprint": "cf1ab32382a201ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77c2d46c6cb1bb0c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/login.tsx:33"}, "properties": {"repobilityId": "82343f862b433527", "scanner": "scanner-primary", "fingerprint": "77c2d46c6cb1bb0c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8f631cd441ccf32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/index.tsx:259"}, "properties": {"repobilityId": "e6bf3263437345cf", "scanner": "scanner-primary", "fingerprint": "d8f631cd441ccf32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1950d1932a9083ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/bosta-sync.ts:86"}, "properties": {"repobilityId": "8583494bb2d22b87", "scanner": "scanner-primary", "fingerprint": "1950d1932a9083ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b0f49e8d08f599e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/bosta.ts:79"}, "properties": {"repobilityId": "6724b3c80f792df5", "scanner": "scanner-primary", "fingerprint": "b0f49e8d08f599e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8042d08ba9c4bf3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/orders.ts:284"}, "properties": {"repobilityId": "efc679f2f4b50b37", "scanner": "scanner-primary", "fingerprint": "8042d08ba9c4bf3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cdd074f81a4cb72a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/bosta-ranking.ts:116"}, "properties": {"repobilityId": "899d9f7efd50682b", "scanner": "scanner-primary", "fingerprint": "cdd074f81a4cb72a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ee9c6f07da4d1b13", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/reassign.ts:57"}, "properties": {"repobilityId": "6e2fcf71d156e597", "scanner": "scanner-primary", "fingerprint": "ee9c6f07da4d1b13", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2db2f271ab6e2513", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/bosta-webhook.ts:47"}, "properties": {"repobilityId": "b4bcf2d7ef95ba80", "scanner": "scanner-primary", "fingerprint": "2db2f271ab6e2513", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e496c3544275aa3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/sync/smart-engine.ts:182"}, "properties": {"repobilityId": "3c489a9a9b2803ab", "scanner": "scanner-primary", "fingerprint": "e496c3544275aa3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5089e988051b3f70", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/ai/correct-new-leads.ts:32"}, "properties": {"repobilityId": "ea530522adabc8d6", "scanner": "scanner-primary", "fingerprint": "5089e988051b3f70", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a253bb78baa48775", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/auth/login.ts:68"}, "properties": {"repobilityId": "8c6ffc0729f239f4", "scanner": "scanner-primary", "fingerprint": "a253bb78baa48775", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-817e79651956454d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/webhook/new-lead.ts:111"}, "properties": {"repobilityId": "a8d4a5351d65e610", "scanner": "scanner-primary", "fingerprint": "817e79651956454d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-893bc7a301364421", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/admin/cleanup-firestore.ts:50"}, "properties": {"repobilityId": "de8b349850724ce8", "scanner": "scanner-primary", "fingerprint": "893bc7a301364421", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9fd41859497f1cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/admin/migrate-data.ts:55"}, "properties": {"repobilityId": "3d137c8e68f32a31", "scanner": "scanner-primary", "fingerprint": "f9fd41859497f1cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06296bb80069fea7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/whatsapp/reply.ts:115"}, "properties": {"repobilityId": "d83c92d8121af320", "scanner": "scanner-primary", "fingerprint": "06296bb80069fea7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ea8f6134527655f6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/whatsapp/webhook.ts:187"}, "properties": {"repobilityId": "dba245027ca3ae05", "scanner": "scanner-primary", "fingerprint": "ea8f6134527655f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e04939cfb62576a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 pages/api/whatsapp/send-media.ts:186"}, "properties": {"repobilityId": "118fcb13ffb39af0", "scanner": "scanner-primary", "fingerprint": "7e04939cfb62576a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f019f2eb5b100c0d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 hooks/useOrderNotifications.ts:93"}, "properties": {"repobilityId": "fd3f1d025a3b40d0", "scanner": "scanner-primary", "fingerprint": "f019f2eb5b100c0d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b33232200f844fcc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 hooks/useFirestoreOrders.ts:174"}, "properties": {"repobilityId": "c435a2f802e0fce9", "scanner": "scanner-primary", "fingerprint": "b33232200f844fcc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-807de0352624c982", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 hooks/useSmartNotifications.ts:417"}, "properties": {"repobilityId": "0adf01b5f1932d9e", "scanner": "scanner-primary", "fingerprint": "807de0352624c982", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77a464701f01cedf", "level": "error", "message": {"text": "Possible secret in README.md"}, "properties": {"repobilityId": "7e8d0f40ced2565c", "scanner": "scanner-primary", "fingerprint": "77a464701f01cedf", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "README.md"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-e282c090fe34887b", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in README.md:104"}, "properties": {"repobilityId": "9f3cd7a09905263d", "scanner": "scanner-primary", "fingerprint": "e282c090fe34887b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "README.md"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-e9681e09589d14a7", "level": "error", "message": {"text": "Possible secret in pages/api/auth/login.ts"}, "properties": {"repobilityId": "e914d468509c84f4", "scanner": "scanner-primary", "fingerprint": "e9681e09589d14a7", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/api/auth/login.ts"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-e9681e09589d14a7", "level": "error", "message": {"text": "Possible secret in pages/api/auth/login.ts"}, "properties": {"repobilityId": "e914d468509c84f4", "scanner": "scanner-primary", "fingerprint": "e9681e09589d14a7", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/api/auth/login.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-e9681e09589d14a7", "level": "error", "message": {"text": "Possible secret in pages/api/auth/login.ts"}, "properties": {"repobilityId": "e914d468509c84f4", "scanner": "scanner-primary", "fingerprint": "e9681e09589d14a7", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pages/api/auth/login.ts"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-bd1bed170d24952d", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in hooks/useCurrentUser.ts:109"}, "properties": {"repobilityId": "08806f65b4a933dd", "scanner": "scanner-primary", "fingerprint": "bd1bed170d24952d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hooks/useCurrentUser.ts"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-45f90e9b0859d98b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2c78867998b460bb", "scanner": "scanner-primary", "fingerprint": "45f90e9b0859d98b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gen-keystore.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-45f90e9b0859d98b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cf9392142f27ac53", "scanner": "scanner-primary", "fingerprint": "45f90e9b0859d98b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gen-keystore.yml"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-6e261099ac31d460", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6c4c3a5bae07888b", "scanner": "scanner-primary", "fingerprint": "6e261099ac31d460", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-dialer-apk.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-6e261099ac31d460", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "78c72842f128979c", "scanner": "scanner-primary", "fingerprint": "6e261099ac31d460", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-dialer-apk.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-6e261099ac31d460", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "11f6b0f86769fa53", "scanner": "scanner-primary", "fingerprint": "6e261099ac31d460", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-dialer-apk.yml"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-6e261099ac31d460", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fbe7921561248b13", "scanner": "scanner-primary", "fingerprint": "6e261099ac31d460", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-dialer-apk.yml"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-08d540c05cf66e5f", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "42a7289322677399", "scanner": "scanner-primary", "fingerprint": "08d540c05cf66e5f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build-dialer-apk.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9acad008f726f0f2", "level": "note", "message": {"text": "Very large file: components/WhatsAppAutomation.tsx (1050 lines)"}, "properties": {"repobilityId": "ae30f7c184f53302", "scanner": "scanner-primary", "fingerprint": "9acad008f726f0f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-de20f18aa11e659f", "level": "note", "message": {"text": "Very large file: components/StockManagement.tsx (3383 lines)"}, "properties": {"repobilityId": "1123b11aee3e7d4b", "scanner": "scanner-primary", "fingerprint": "de20f18aa11e659f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5e013386dd9a64b1", "level": "note", "message": {"text": "Very large file: components/WhatsAppInbox.tsx (1282 lines)"}, "properties": {"repobilityId": "e7950163cb6669c6", "scanner": "scanner-primary", "fingerprint": "5e013386dd9a64b1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-778b5a70fa0c1564", "level": "note", "message": {"text": "Very large file: components/OrderEditModal.tsx (1343 lines)"}, "properties": {"repobilityId": "53edebb8e5081129", "scanner": "scanner-primary", "fingerprint": "778b5a70fa0c1564", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-08af5f22041907c1", "level": "note", "message": {"text": "Very large file: components/OrdersTable.tsx (1785 lines)"}, "properties": {"repobilityId": "865521de07382ddf", "scanner": "scanner-primary", "fingerprint": "08af5f22041907c1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3395218f2561fe84", "level": "note", "message": {"text": "Very large file: lib/firestoreService.ts (1539 lines)"}, "properties": {"repobilityId": "f85049e6873e936c", "scanner": "scanner-primary", "fingerprint": "3395218f2561fe84", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-80b299f4f4a030fa", "level": "note", "message": {"text": "Very large file: pages/api/sync/smart-engine.ts (1052 lines)"}, "properties": {"repobilityId": "ab8d9eb6510ea5c6", "scanner": "scanner-primary", "fingerprint": "80b299f4f4a030fa", "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": "695d0f2872d7ccd7", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "36c328c3a631b6b8", "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": "8d3956288de506b8", "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": "6b8ceb19f0fa9ef1", "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": "6a3b7ee63c67192d", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "76a09ce75370d9d8", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "c428a654b44c0f7b", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "c9add354c3f17d89", "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": "eac08f377fb8a483", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-7dafa2b805297c0c", "level": "note", "message": {"text": "Legacy-named symbol `order_confirmed_v2` in functions/src/index.ts:126"}, "properties": {"repobilityId": "16ab5a6447c13743", "scanner": "scanner-primary", "fingerprint": "7dafa2b805297c0c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d3232b8798d6f9a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in functions/src/index.ts:639"}, "properties": {"repobilityId": "bf59886914a9a388", "scanner": "scanner-primary", "fingerprint": "d3232b8798d6f9a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40dec7aed47f252b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/send-welcome-to-all.js:109"}, "properties": {"repobilityId": "e98de0723597d93f", "scanner": "scanner-primary", "fingerprint": "40dec7aed47f252b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a042b5ea0f57804a", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/StockManagement.tsx:129"}, "properties": {"repobilityId": "208eb61102f004d0", "scanner": "scanner-primary", "fingerprint": "a042b5ea0f57804a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a668fe43b27d3be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/stock/types.ts:48"}, "properties": {"repobilityId": "fbdc029c51fdaa16", "scanner": "scanner-primary", "fingerprint": "6a668fe43b27d3be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb9b4145065f08c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/aiAddress.ts:121"}, "properties": {"repobilityId": "09e7f392a77b9287", "scanner": "scanner-primary", "fingerprint": "cb9b4145065f08c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e2a1664c922d634", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/aiProvider.ts:5"}, "properties": {"repobilityId": "ccde76b1d1904757", "scanner": "scanner-primary", "fingerprint": "2e2a1664c922d634", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cdad519ab720c621", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/authFetch.ts:34"}, "properties": {"repobilityId": "f19c6cb61a5243ab", "scanner": "scanner-primary", "fingerprint": "cdad519ab720c621", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f96ad7b6074e024d", "level": "note", "message": {"text": "Legacy-named symbol `order_confirmed_v2` in lib/whatsappCloudService.ts:682"}, "properties": {"repobilityId": "72e66540a1925651", "scanner": "scanner-primary", "fingerprint": "f96ad7b6074e024d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-59abf0975e3a91a3", "level": "none", "message": {"text": "Commented-code block (5 lines) in pages/api/whatsapp/webhook.ts:146"}, "properties": {"repobilityId": "97cb88ec4de4c9f6", "scanner": "scanner-primary", "fingerprint": "59abf0975e3a91a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-274418b035fefb70", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/whatsapp/webhook.ts:519"}, "properties": {"repobilityId": "1c2ff3e944f5f81b", "scanner": "scanner-primary", "fingerprint": "274418b035fefb70", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a4e42ebbef7a8d16", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 pages/api/whatsapp/send-media.ts:164"}, "properties": {"repobilityId": "be3e83c50fa469c9", "scanner": "scanner-primary", "fingerprint": "a4e42ebbef7a8d16", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}