{"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-5f59249d66132789", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-users.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-users.ts:66"}, "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-0583eff9ae576441", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/check-subscription/index.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/check-subscription/index.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-2618b1732d02fb80", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/ensure-user-onboarding/index.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/ensure-user-onboarding/index.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-bbefff9e7a28b180", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/admin-manage-tenant/index.ts:118", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/admin-manage-tenant/index.ts:118"}, "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-876b381bd4dc3ad8", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/stripe-webhook/index.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/stripe-webhook/index.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8cc9342a30b33df0", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/create-checkout/index.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/create-checkout/index.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b67afa881cd0d64", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/cancel-subscription/index.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/cancel-subscription/index.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-286c32cf3192b2bc", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/auth-email-hook/index.ts:223", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/auth-email-hook/index.ts:223"}, "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-092c09cd00fbf21a", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/customer-portal/index.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/customer-portal/index.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-27654a515a11b2d7", "name": "TODO/FIXME marker in shipping code \u2014 dev-dist/workbox-7e5eb42b.js:787", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 dev-dist/workbox-7e5eb42b.js:787"}, "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-3203cde03cca4059", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AppShell.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AppShell.tsx:126"}, "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-24dcc657f471c018", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WorkspaceSwitcher.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WorkspaceSwitcher.tsx:92"}, "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-60e93636b02ea113", "name": "Stray `console.log` in TS/JS \u2014 src/components/TrialBanner.tsx:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TrialBanner.tsx:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-30c2855412c4c4bb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/LocationAutocomplete.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/LocationAutocomplete.tsx:94"}, "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-6116ed16290024fd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/TeamAssignmentSection.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/TeamAssignmentSection.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a0140794b4a45c6f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/BookingCalendar.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/BookingCalendar.tsx:108"}, "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-0bc42d2a1dab3858", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/AttachmentsSection.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/AttachmentsSection.tsx:114"}, "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-257c4c3a52aa9330", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/VenueAutocomplete.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/VenueAutocomplete.tsx:92"}, "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-5178208df55fef62", "name": "Stray `console.log` in TS/JS \u2014 src/components/bookings/ColleaguesSection.tsx:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/bookings/ColleaguesSection.tsx:122"}, "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-b209c77e83b119fd", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:70", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:70"}, "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-10b4217e30916ee0", "name": "Stray `console.log` in TS/JS \u2014 src/contexts/SubscriptionContext.tsx:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/contexts/SubscriptionContext.tsx:66"}, "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-4cbb8c91a74de2ad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PublicBooking.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PublicBooking.tsx:195"}, "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-e5c6b316fccb9889", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Invoices.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Invoices.tsx:361"}, "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-054d69528e5b4e15", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Dashboard.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Dashboard.tsx:89"}, "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-c2922b5a7ffde7fc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Bookings.tsx:648", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Bookings.tsx:648"}, "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-4fda2b710cec3dfb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Clients.tsx:306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Clients.tsx:306"}, "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-4782fb1adae27f22", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/SettingsPage.tsx:517", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/SettingsPage.tsx:517"}, "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-1818072317c9be60", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/LandingPageEditor.tsx:331", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/LandingPageEditor.tsx:331"}, "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-559dd808fe407efa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Team.tsx:462", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Team.tsx:462"}, "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-93748ce25e61b0e8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminShell.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminShell.tsx:78"}, "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-a81350d1e3e54747", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminSupportTickets.tsx:133", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminSupportTickets.tsx:133"}, "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-122c3a4e5501bcf2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminAuditLog.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminAuditLog.tsx:71"}, "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-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4e8d1d254d07f306", "name": "Possible secret in scripts/seed-users.ts", "shortDescription": {"text": "Possible secret in scripts/seed-users.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-55fdd12645538bcc", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/calendar-export/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/calendar-export/index.ts:5"}, "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-bc5c657d028177bc", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/check-subscription/index.ts:6", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/check-subscription/index.ts:6"}, "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-8729af9735686dd7", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/ensure-user-onboarding/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ensure-user-onboarding/index.ts:5"}, "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-1f9bf585e05a308d", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/send-notification-email/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/send-notification-email/index.ts:5"}, "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-0ee926d5960c533f", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/google-places-autocomplete/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/google-places-autocomplete/index.ts:4"}, "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-2fe046fbdb417a4d", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/colleague-booking-request/index.ts:12", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/colleague-booking-request/index.ts:12"}, "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-a2d6a7d250eabcec", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/send-invoice-email/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/send-invoice-email/index.ts:5"}, "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-38149277bba437c1", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/stripe-webhook/index.ts:7", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/stripe-webhook/index.ts:7"}, "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-cfc7631aa2448247", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-team-member/index.ts:19", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-team-member/index.ts:19"}, "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-141081fceafbf8dd", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/create-checkout/index.ts:13", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/create-checkout/index.ts:13"}, "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-8823d2b22c0e3c7c", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/cancel-subscription/index.ts:6", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/cancel-subscription/index.ts:6"}, "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-0991368f3d5875e5", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/create-connect-account/index.ts:6", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/create-connect-account/index.ts:6"}, "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-b077bb094584c4a7", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/send-auth-email/index.ts:31", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/send-auth-email/index.ts:31"}, "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-29726183a18fa810", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/public-chat/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/public-chat/index.ts:4"}, "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-cab6b2f54a040280", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/auth-email-hook/index.ts:18", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/auth-email-hook/index.ts:18"}, "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-9ce3c4d5e4410dfe", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/customer-portal/index.ts:6", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/customer-portal/index.ts:6"}, "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-353a81869cc404cd", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/create-invoice-payment/index.ts:13", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/create-invoice-payment/index.ts:13"}, "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-675d17cdbac67e60", "name": "Possible secret in src/i18n/en.ts", "shortDescription": {"text": "Possible secret in src/i18n/en.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-c970350be582cf77", "name": "Possible secret in src/i18n/he.ts", "shortDescription": {"text": "Possible secret in src/i18n/he.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-e36dd80986a70c2b", "name": "Possible secret in src/i18n/yi.ts", "shortDescription": {"text": "Possible secret in src/i18n/yi.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-93d0283845aa2c2d", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:70", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:70"}, "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-6f0785f93fa1c208", "name": "Possible secret in src/lib/admin-functions.ts", "shortDescription": {"text": "Possible secret in src/lib/admin-functions.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-f8e501c82d789811", "name": "Insecure pattern 'document_write' in src/pages/app/Invoices.tsx:194", "shortDescription": {"text": "Insecure pattern 'document_write' in src/pages/app/Invoices.tsx:194"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e87e678cc69255f", "name": "Possible secret in src/pages/admin/AdminAuditLog.tsx", "shortDescription": {"text": "Possible secret in src/pages/admin/AdminAuditLog.tsx"}, "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-5841b115b8b906fd", "name": "Very large file: dev-dist/workbox-7e5eb42b.js (3395 lines)", "shortDescription": {"text": "Very large file: dev-dist/workbox-7e5eb42b.js (3395 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-b9c24011ed514f0c", "name": "Very large file: src/pages/app/Bookings.tsx (1120 lines)", "shortDescription": {"text": "Very large file: src/pages/app/Bookings.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": "11 test file(s) for 207 source file(s) (ratio 0.05). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 52 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 84 placeholder/mock markers across 36 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, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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, operator-readme. 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-2ff4719883abf794", "name": "Commented-code block (6 lines) in playwright.config.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in playwright.config.ts:4"}, "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-355f22942c8ecad1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-work-report/index.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-work-report/index.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3211501adb2a4e21", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-notification-email/index.ts:182", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-notification-email/index.ts:182"}, "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-a0c2ee3f9163cf0d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/google-places-autocomplete/index.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/google-places-autocomplete/index.ts:42"}, "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-37188b3f9f84669b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/colleague-booking-request/index.ts:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/colleague-booking-request/index.ts:61"}, "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-a6ebc4cae58d01d7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-invoice-email/index.ts:186", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-invoice-email/index.ts:186"}, "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-e92c3d26c9e4ee9b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/invite-team-member/index.ts:138", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/invite-team-member/index.ts:138"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eae55b43efb26944", "name": "Legacy-named symbol `displayOld` in supabase/functions/send-auth-email/index.ts:191", "shortDescription": {"text": "Legacy-named symbol `displayOld` in supabase/functions/send-auth-email/index.ts:191"}, "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-05f86fd738b17c9a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-auth-email/index.ts:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-auth-email/index.ts:95"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39cae5bd09d9ddbe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/public-chat/index.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/public-chat/index.ts:63"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e819529c48eb6dd9", "name": "Commented-code block (7 lines) in dev-dist/workbox-7e5eb42b.js:2535", "shortDescription": {"text": "Commented-code block (7 lines) in dev-dist/workbox-7e5eb42b.js:2535"}, "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-3735ea987f1d314e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 dev-dist/workbox-7e5eb42b.js:750", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dev-dist/workbox-7e5eb42b.js:750"}, "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-45d9be95495f8457", "name": "Commented-code block (5 lines) in src/lib/subscription-tiers.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/subscription-tiers.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-319e66a630e14977", "name": "2 env vars used in code but missing from .env.example", "shortDescription": {"text": "2 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEV`, `VITE_PUBLIC_BOOKING_ORIGIN`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-25d0c5669cd9b822", "name": "Frontend route `/auth` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/auth` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9a0b99730ac89264", "name": "Frontend route `/book/:slug` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/book/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-38799d3de8c0e0ef", "name": "Frontend route `/payment-success` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/payment-success` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2494931ba5034280", "name": "Frontend route `/payment-cancelled` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/payment-cancelled` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2781129291c065d6", "name": "Frontend route `bookings` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `bookings` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b113530310976905", "name": "Frontend route `clients` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `clients` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c6b1063982c47250", "name": "Frontend route `invoices` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `invoices` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-130f20804b3b07fb", "name": "Frontend route `team` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `team` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd9944d8886cdb6c", "name": "Frontend route `social` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `social` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1bded507f249edf8", "name": "Frontend route `support` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `support` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0626b4c2e4efcb82", "name": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9aac4416bc780cf4", "name": "Frontend route `upgrade` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `upgrade` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2d6a2d0bfec57f9", "name": "Frontend route `booking-page` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `booking-page` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5fb1af8687344f58", "name": "Frontend route `agents` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `agents` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-497e32deb39c13dd", "name": "Frontend route `finance` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `finance` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-678650e22915763a", "name": "Frontend route `tenants` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `tenants` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fea04209d8ae8555", "name": "Frontend route `users` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `users` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-243e1841e75a3810", "name": "Frontend route `billing` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `billing` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c334727232c15ac9", "name": "Frontend route `revenue` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `revenue` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9f16b729ca26901e", "name": "Frontend route `support-tickets` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `support-tickets` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-59063ae222c06c5d", "name": "Frontend route `audit-log` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `audit-log` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76c3df96bdc4f90b", "name": "Frontend route `admins` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admins` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-41c27407df6dd28c", "name": "Frontend route `impersonate/:tenantId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `impersonate/:tenantId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19660"}, "properties": {"repository": "simchasync/simchasync-web", "repoUrl": "https://github.com/simchasync/simchasync-web", "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-5f59249d66132789", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-users.ts:66"}, "properties": {"repobilityId": "9d95dff2693e9eed", "scanner": "scanner-primary", "fingerprint": "5f59249d66132789", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0583eff9ae576441", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/check-subscription/index.ts:13"}, "properties": {"repobilityId": "f4ed559d908ea365", "scanner": "scanner-primary", "fingerprint": "0583eff9ae576441", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2618b1732d02fb80", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/ensure-user-onboarding/index.ts:57"}, "properties": {"repobilityId": "ce6442e264fbce06", "scanner": "scanner-primary", "fingerprint": "2618b1732d02fb80", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bbefff9e7a28b180", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/admin-manage-tenant/index.ts:118"}, "properties": {"repobilityId": "a78303a7cb680f60", "scanner": "scanner-primary", "fingerprint": "bbefff9e7a28b180", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-876b381bd4dc3ad8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/stripe-webhook/index.ts:14"}, "properties": {"repobilityId": "7c738a141c293866", "scanner": "scanner-primary", "fingerprint": "876b381bd4dc3ad8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8cc9342a30b33df0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/create-checkout/index.ts:20"}, "properties": {"repobilityId": "1b4e7a4818b9b3e8", "scanner": "scanner-primary", "fingerprint": "8cc9342a30b33df0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b67afa881cd0d64", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/cancel-subscription/index.ts:14"}, "properties": {"repobilityId": "9a07ccb55d13eac4", "scanner": "scanner-primary", "fingerprint": "0b67afa881cd0d64", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-286c32cf3192b2bc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/auth-email-hook/index.ts:223"}, "properties": {"repobilityId": "febfb37bd73a7c9a", "scanner": "scanner-primary", "fingerprint": "286c32cf3192b2bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-092c09cd00fbf21a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/customer-portal/index.ts:13"}, "properties": {"repobilityId": "81017a7b5664739e", "scanner": "scanner-primary", "fingerprint": "092c09cd00fbf21a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-27654a515a11b2d7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 dev-dist/workbox-7e5eb42b.js:787"}, "properties": {"repobilityId": "e0fbcfbd9734d623", "scanner": "scanner-primary", "fingerprint": "27654a515a11b2d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3203cde03cca4059", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AppShell.tsx:126"}, "properties": {"repobilityId": "e43655288de2f4b3", "scanner": "scanner-primary", "fingerprint": "3203cde03cca4059", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24dcc657f471c018", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WorkspaceSwitcher.tsx:92"}, "properties": {"repobilityId": "6a3474e3892d61a6", "scanner": "scanner-primary", "fingerprint": "24dcc657f471c018", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60e93636b02ea113", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TrialBanner.tsx:14"}, "properties": {"repobilityId": "8f84e037ce52c186", "scanner": "scanner-primary", "fingerprint": "60e93636b02ea113", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-30c2855412c4c4bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/LocationAutocomplete.tsx:94"}, "properties": {"repobilityId": "6e8acdb57b1e6d02", "scanner": "scanner-primary", "fingerprint": "30c2855412c4c4bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6116ed16290024fd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/TeamAssignmentSection.tsx:176"}, "properties": {"repobilityId": "b74998ff6d8b1bb3", "scanner": "scanner-primary", "fingerprint": "6116ed16290024fd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a0140794b4a45c6f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/BookingCalendar.tsx:108"}, "properties": {"repobilityId": "3a415af9508767ee", "scanner": "scanner-primary", "fingerprint": "a0140794b4a45c6f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0bc42d2a1dab3858", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/AttachmentsSection.tsx:114"}, "properties": {"repobilityId": "b2f65cef0593cfb5", "scanner": "scanner-primary", "fingerprint": "0bc42d2a1dab3858", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-257c4c3a52aa9330", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bookings/VenueAutocomplete.tsx:92"}, "properties": {"repobilityId": "afa089ca36b8416c", "scanner": "scanner-primary", "fingerprint": "257c4c3a52aa9330", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5178208df55fef62", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/bookings/ColleaguesSection.tsx:122"}, "properties": {"repobilityId": "557f16fa4b030f41", "scanner": "scanner-primary", "fingerprint": "5178208df55fef62", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b209c77e83b119fd", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:70"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "b209c77e83b119fd", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-10b4217e30916ee0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/contexts/SubscriptionContext.tsx:66"}, "properties": {"repobilityId": "f6f5bce56f9d83c8", "scanner": "scanner-primary", "fingerprint": "10b4217e30916ee0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4cbb8c91a74de2ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PublicBooking.tsx:195"}, "properties": {"repobilityId": "37e6a7f17b749ce4", "scanner": "scanner-primary", "fingerprint": "4cbb8c91a74de2ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5c6b316fccb9889", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Invoices.tsx:361"}, "properties": {"repobilityId": "d9a56bcd7e7c6484", "scanner": "scanner-primary", "fingerprint": "e5c6b316fccb9889", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-054d69528e5b4e15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Dashboard.tsx:89"}, "properties": {"repobilityId": "9e90b6f43385182f", "scanner": "scanner-primary", "fingerprint": "054d69528e5b4e15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2922b5a7ffde7fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Bookings.tsx:648"}, "properties": {"repobilityId": "fffb8e4a9355bf41", "scanner": "scanner-primary", "fingerprint": "c2922b5a7ffde7fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fda2b710cec3dfb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Clients.tsx:306"}, "properties": {"repobilityId": "e17bfeb196bd080c", "scanner": "scanner-primary", "fingerprint": "4fda2b710cec3dfb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4782fb1adae27f22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/SettingsPage.tsx:517"}, "properties": {"repobilityId": "209fb361ff2d9bfe", "scanner": "scanner-primary", "fingerprint": "4782fb1adae27f22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1818072317c9be60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/LandingPageEditor.tsx:331"}, "properties": {"repobilityId": "18260de42bb15990", "scanner": "scanner-primary", "fingerprint": "1818072317c9be60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-559dd808fe407efa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/app/Team.tsx:462"}, "properties": {"repobilityId": "e6328f0af4b9320a", "scanner": "scanner-primary", "fingerprint": "559dd808fe407efa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93748ce25e61b0e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminShell.tsx:78"}, "properties": {"repobilityId": "78220906b62d4328", "scanner": "scanner-primary", "fingerprint": "93748ce25e61b0e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a81350d1e3e54747", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminSupportTickets.tsx:133"}, "properties": {"repobilityId": "ead8ae5fc3fe95f2", "scanner": "scanner-primary", "fingerprint": "a81350d1e3e54747", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-122c3a4e5501bcf2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminAuditLog.tsx:71"}, "properties": {"repobilityId": "8e8110e6284a7a88", "scanner": "scanner-primary", "fingerprint": "122c3a4e5501bcf2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-4e8d1d254d07f306", "level": "error", "message": {"text": "Possible secret in scripts/seed-users.ts"}, "properties": {"repobilityId": "3a477f4996beacd4", "scanner": "scanner-primary", "fingerprint": "4e8d1d254d07f306", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/seed-users.ts"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-4e8d1d254d07f306", "level": "error", "message": {"text": "Possible secret in scripts/seed-users.ts"}, "properties": {"repobilityId": "3a477f4996beacd4", "scanner": "scanner-primary", "fingerprint": "4e8d1d254d07f306", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/seed-users.ts"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-4e8d1d254d07f306", "level": "error", "message": {"text": "Possible secret in scripts/seed-users.ts"}, "properties": {"repobilityId": "3a477f4996beacd4", "scanner": "scanner-primary", "fingerprint": "4e8d1d254d07f306", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/seed-users.ts"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-4e8d1d254d07f306", "level": "error", "message": {"text": "Possible secret in scripts/seed-users.ts"}, "properties": {"repobilityId": "3a477f4996beacd4", "scanner": "scanner-primary", "fingerprint": "4e8d1d254d07f306", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/seed-users.ts"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-4e8d1d254d07f306", "level": "error", "message": {"text": "Possible secret in scripts/seed-users.ts"}, "properties": {"repobilityId": "3a477f4996beacd4", "scanner": "scanner-primary", "fingerprint": "4e8d1d254d07f306", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/seed-users.ts"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-55fdd12645538bcc", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/calendar-export/index.ts:5"}, "properties": {"repobilityId": "015a320e1a76f207", "scanner": "scanner-primary", "fingerprint": "55fdd12645538bcc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/calendar-export/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-bc5c657d028177bc", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/check-subscription/index.ts:6"}, "properties": {"repobilityId": "050dc124782a9b82", "scanner": "scanner-primary", "fingerprint": "bc5c657d028177bc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/check-subscription/index.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-8729af9735686dd7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ensure-user-onboarding/index.ts:5"}, "properties": {"repobilityId": "3a256255b214309c", "scanner": "scanner-primary", "fingerprint": "8729af9735686dd7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/ensure-user-onboarding/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-1f9bf585e05a308d", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/send-notification-email/index.ts:5"}, "properties": {"repobilityId": "f6ba8e5d9464f9da", "scanner": "scanner-primary", "fingerprint": "1f9bf585e05a308d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/send-notification-email/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-0ee926d5960c533f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/google-places-autocomplete/index.ts:4"}, "properties": {"repobilityId": "e7bec0abe1ee76ee", "scanner": "scanner-primary", "fingerprint": "0ee926d5960c533f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/google-places-autocomplete/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-2fe046fbdb417a4d", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/colleague-booking-request/index.ts:12"}, "properties": {"repobilityId": "9a4fa44423d16ab8", "scanner": "scanner-primary", "fingerprint": "2fe046fbdb417a4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/colleague-booking-request/index.ts"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-a2d6a7d250eabcec", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/send-invoice-email/index.ts:5"}, "properties": {"repobilityId": "af9915fc803b8cb7", "scanner": "scanner-primary", "fingerprint": "a2d6a7d250eabcec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/send-invoice-email/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-38149277bba437c1", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/stripe-webhook/index.ts:7"}, "properties": {"repobilityId": "37ab8b4c9da13a4c", "scanner": "scanner-primary", "fingerprint": "38149277bba437c1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/stripe-webhook/index.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-cfc7631aa2448247", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-team-member/index.ts:19"}, "properties": {"repobilityId": "e64c5aa1d063019b", "scanner": "scanner-primary", "fingerprint": "cfc7631aa2448247", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/invite-team-member/index.ts"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-141081fceafbf8dd", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/create-checkout/index.ts:13"}, "properties": {"repobilityId": "1fb7bfc2c2e287bc", "scanner": "scanner-primary", "fingerprint": "141081fceafbf8dd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/create-checkout/index.ts"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-8823d2b22c0e3c7c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/cancel-subscription/index.ts:6"}, "properties": {"repobilityId": "89da95b20436f4d1", "scanner": "scanner-primary", "fingerprint": "8823d2b22c0e3c7c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/cancel-subscription/index.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-0991368f3d5875e5", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/create-connect-account/index.ts:6"}, "properties": {"repobilityId": "fba6b039adfff59e", "scanner": "scanner-primary", "fingerprint": "0991368f3d5875e5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/create-connect-account/index.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-b077bb094584c4a7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/send-auth-email/index.ts:31"}, "properties": {"repobilityId": "1033ff78eb210ae8", "scanner": "scanner-primary", "fingerprint": "b077bb094584c4a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/send-auth-email/index.ts"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-29726183a18fa810", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/public-chat/index.ts:4"}, "properties": {"repobilityId": "2e6468db8ca8d9fc", "scanner": "scanner-primary", "fingerprint": "29726183a18fa810", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/public-chat/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-cab6b2f54a040280", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/auth-email-hook/index.ts:18"}, "properties": {"repobilityId": "249fc31148305b77", "scanner": "scanner-primary", "fingerprint": "cab6b2f54a040280", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/auth-email-hook/index.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-9ce3c4d5e4410dfe", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/customer-portal/index.ts:6"}, "properties": {"repobilityId": "de8331e7451966be", "scanner": "scanner-primary", "fingerprint": "9ce3c4d5e4410dfe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/customer-portal/index.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-353a81869cc404cd", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/create-invoice-payment/index.ts:13"}, "properties": {"repobilityId": "9d9f1bf65a566b2c", "scanner": "scanner-primary", "fingerprint": "353a81869cc404cd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/create-invoice-payment/index.ts"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-675d17cdbac67e60", "level": "error", "message": {"text": "Possible secret in src/i18n/en.ts"}, "properties": {"repobilityId": "bd70c83078ec02d6", "scanner": "scanner-primary", "fingerprint": "675d17cdbac67e60", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/en.ts"}, "region": {"startLine": 312}}}]}, {"ruleId": "scanner-675d17cdbac67e60", "level": "error", "message": {"text": "Possible secret in src/i18n/en.ts"}, "properties": {"repobilityId": "bd70c83078ec02d6", "scanner": "scanner-primary", "fingerprint": "675d17cdbac67e60", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/en.ts"}, "region": {"startLine": 315}}}]}, {"ruleId": "scanner-675d17cdbac67e60", "level": "error", "message": {"text": "Possible secret in src/i18n/en.ts"}, "properties": {"repobilityId": "bd70c83078ec02d6", "scanner": "scanner-primary", "fingerprint": "675d17cdbac67e60", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/en.ts"}, "region": {"startLine": 318}}}]}, {"ruleId": "scanner-675d17cdbac67e60", "level": "error", "message": {"text": "Possible secret in src/i18n/en.ts"}, "properties": {"repobilityId": "bd70c83078ec02d6", "scanner": "scanner-primary", "fingerprint": "675d17cdbac67e60", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/en.ts"}, "region": {"startLine": 320}}}]}, {"ruleId": "scanner-675d17cdbac67e60", "level": "error", "message": {"text": "Possible secret in src/i18n/en.ts"}, "properties": {"repobilityId": "bd70c83078ec02d6", "scanner": "scanner-primary", "fingerprint": "675d17cdbac67e60", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/en.ts"}, "region": {"startLine": 321}}}]}, {"ruleId": "scanner-675d17cdbac67e60", "level": "error", "message": {"text": "Possible secret in src/i18n/en.ts"}, "properties": {"repobilityId": "bd70c83078ec02d6", "scanner": "scanner-primary", "fingerprint": "675d17cdbac67e60", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/en.ts"}, "region": {"startLine": 323}}}]}, {"ruleId": "scanner-c970350be582cf77", "level": "error", "message": {"text": "Possible secret in src/i18n/he.ts"}, "properties": {"repobilityId": "1f16624c9444f8b9", "scanner": "scanner-primary", "fingerprint": "c970350be582cf77", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/he.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-c970350be582cf77", "level": "error", "message": {"text": "Possible secret in src/i18n/he.ts"}, "properties": {"repobilityId": "1f16624c9444f8b9", "scanner": "scanner-primary", "fingerprint": "c970350be582cf77", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/he.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-c970350be582cf77", "level": "error", "message": {"text": "Possible secret in src/i18n/he.ts"}, "properties": {"repobilityId": "1f16624c9444f8b9", "scanner": "scanner-primary", "fingerprint": "c970350be582cf77", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/he.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-c970350be582cf77", "level": "error", "message": {"text": "Possible secret in src/i18n/he.ts"}, "properties": {"repobilityId": "1f16624c9444f8b9", "scanner": "scanner-primary", "fingerprint": "c970350be582cf77", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/he.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-c970350be582cf77", "level": "error", "message": {"text": "Possible secret in src/i18n/he.ts"}, "properties": {"repobilityId": "1f16624c9444f8b9", "scanner": "scanner-primary", "fingerprint": "c970350be582cf77", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/he.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-e36dd80986a70c2b", "level": "error", "message": {"text": "Possible secret in src/i18n/yi.ts"}, "properties": {"repobilityId": "49d9d9ba3b46975d", "scanner": "scanner-primary", "fingerprint": "e36dd80986a70c2b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/yi.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-e36dd80986a70c2b", "level": "error", "message": {"text": "Possible secret in src/i18n/yi.ts"}, "properties": {"repobilityId": "49d9d9ba3b46975d", "scanner": "scanner-primary", "fingerprint": "e36dd80986a70c2b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/yi.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-e36dd80986a70c2b", "level": "error", "message": {"text": "Possible secret in src/i18n/yi.ts"}, "properties": {"repobilityId": "49d9d9ba3b46975d", "scanner": "scanner-primary", "fingerprint": "e36dd80986a70c2b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/yi.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-e36dd80986a70c2b", "level": "error", "message": {"text": "Possible secret in src/i18n/yi.ts"}, "properties": {"repobilityId": "49d9d9ba3b46975d", "scanner": "scanner-primary", "fingerprint": "e36dd80986a70c2b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/yi.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-e36dd80986a70c2b", "level": "error", "message": {"text": "Possible secret in src/i18n/yi.ts"}, "properties": {"repobilityId": "49d9d9ba3b46975d", "scanner": "scanner-primary", "fingerprint": "e36dd80986a70c2b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/yi.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-e36dd80986a70c2b", "level": "error", "message": {"text": "Possible secret in src/i18n/yi.ts"}, "properties": {"repobilityId": "49d9d9ba3b46975d", "scanner": "scanner-primary", "fingerprint": "e36dd80986a70c2b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/i18n/yi.ts"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-93d0283845aa2c2d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:70"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "93d0283845aa2c2d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-6f0785f93fa1c208", "level": "error", "message": {"text": "Possible secret in src/lib/admin-functions.ts"}, "properties": {"repobilityId": "94d48e5acb5b5e0a", "scanner": "scanner-primary", "fingerprint": "6f0785f93fa1c208", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/admin-functions.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-f8e501c82d789811", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/pages/app/Invoices.tsx:194"}, "properties": {"repobilityId": "51fe1368f8d0beeb", "scanner": "scanner-primary", "fingerprint": "f8e501c82d789811", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/app/Invoices.tsx"}, "region": {"startLine": 194}}}]}, {"ruleId": "scanner-7e87e678cc69255f", "level": "error", "message": {"text": "Possible secret in src/pages/admin/AdminAuditLog.tsx"}, "properties": {"repobilityId": "d7d36d37ffdb96a4", "scanner": "scanner-primary", "fingerprint": "7e87e678cc69255f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/admin/AdminAuditLog.tsx"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-5841b115b8b906fd", "level": "note", "message": {"text": "Very large file: dev-dist/workbox-7e5eb42b.js (3395 lines)"}, "properties": {"repobilityId": "b7353decc6e46c36", "scanner": "scanner-primary", "fingerprint": "5841b115b8b906fd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b9c24011ed514f0c", "level": "note", "message": {"text": "Very large file: src/pages/app/Bookings.tsx (1120 lines)"}, "properties": {"repobilityId": "6b679ca73dce6409", "scanner": "scanner-primary", "fingerprint": "b9c24011ed514f0c", "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": "f12edf5e9873b5f0", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "ee3cc180cd048ce2", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "37c7c8d0ed957707", "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": "87462cc1cff2793e", "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": "d1a151efac22b72b", "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": "7892792031a3af6c", "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": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "25789ebbb3965809", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "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": "7bc52092d8475c50", "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": "060b026dbbfb6566", "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": "a284c4ad32fe9f64", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2ff4719883abf794", "level": "none", "message": {"text": "Commented-code block (6 lines) in playwright.config.ts:4"}, "properties": {"repobilityId": "9800bf3a1375b1b1", "scanner": "scanner-primary", "fingerprint": "2ff4719883abf794", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-355f22942c8ecad1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-work-report/index.ts:29"}, "properties": {"repobilityId": "fa4ecdb67fc379e1", "scanner": "scanner-primary", "fingerprint": "355f22942c8ecad1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3211501adb2a4e21", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-notification-email/index.ts:182"}, "properties": {"repobilityId": "63b2c0b3d0b25847", "scanner": "scanner-primary", "fingerprint": "3211501adb2a4e21", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0c2ee3f9163cf0d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/google-places-autocomplete/index.ts:42"}, "properties": {"repobilityId": "e30edf608d3f6531", "scanner": "scanner-primary", "fingerprint": "a0c2ee3f9163cf0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37188b3f9f84669b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/colleague-booking-request/index.ts:61"}, "properties": {"repobilityId": "b36ebd8882590441", "scanner": "scanner-primary", "fingerprint": "37188b3f9f84669b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a6ebc4cae58d01d7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-invoice-email/index.ts:186"}, "properties": {"repobilityId": "0aa10d34eaf2c459", "scanner": "scanner-primary", "fingerprint": "a6ebc4cae58d01d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e92c3d26c9e4ee9b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/invite-team-member/index.ts:138"}, "properties": {"repobilityId": "e5f0cc2e87a8411d", "scanner": "scanner-primary", "fingerprint": "e92c3d26c9e4ee9b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eae55b43efb26944", "level": "note", "message": {"text": "Legacy-named symbol `displayOld` in supabase/functions/send-auth-email/index.ts:191"}, "properties": {"repobilityId": "13c8cce33b9b0ce6", "scanner": "scanner-primary", "fingerprint": "eae55b43efb26944", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-05f86fd738b17c9a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-auth-email/index.ts:95"}, "properties": {"repobilityId": "22816dc3c8429721", "scanner": "scanner-primary", "fingerprint": "05f86fd738b17c9a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-39cae5bd09d9ddbe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/public-chat/index.ts:63"}, "properties": {"repobilityId": "edfc45f3ae5b486f", "scanner": "scanner-primary", "fingerprint": "39cae5bd09d9ddbe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e819529c48eb6dd9", "level": "none", "message": {"text": "Commented-code block (7 lines) in dev-dist/workbox-7e5eb42b.js:2535"}, "properties": {"repobilityId": "c5bc73c459c93e68", "scanner": "scanner-primary", "fingerprint": "e819529c48eb6dd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3735ea987f1d314e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dev-dist/workbox-7e5eb42b.js:750"}, "properties": {"repobilityId": "ebb4085097cb1c33", "scanner": "scanner-primary", "fingerprint": "3735ea987f1d314e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-45d9be95495f8457", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/subscription-tiers.ts:1"}, "properties": {"repobilityId": "950e33799950913a", "scanner": "scanner-primary", "fingerprint": "45d9be95495f8457", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-319e66a630e14977", "level": "none", "message": {"text": "2 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d838d1fc5d8231c9", "scanner": "scanner-primary", "fingerprint": "319e66a630e14977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-25d0c5669cd9b822", "level": "warning", "message": {"text": "Frontend route `/auth` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "8051efe6684ef8a6", "scanner": "scanner-primary", "fingerprint": "25d0c5669cd9b822", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9a0b99730ac89264", "level": "warning", "message": {"text": "Frontend route `/book/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a00e96c549e10484", "scanner": "scanner-primary", "fingerprint": "9a0b99730ac89264", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-38799d3de8c0e0ef", "level": "warning", "message": {"text": "Frontend route `/payment-success` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7015377e6da694e3", "scanner": "scanner-primary", "fingerprint": "38799d3de8c0e0ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2494931ba5034280", "level": "warning", "message": {"text": "Frontend route `/payment-cancelled` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "51cfb84f11a8226b", "scanner": "scanner-primary", "fingerprint": "2494931ba5034280", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2781129291c065d6", "level": "warning", "message": {"text": "Frontend route `bookings` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4d2d0eac1cc789ee", "scanner": "scanner-primary", "fingerprint": "2781129291c065d6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b113530310976905", "level": "warning", "message": {"text": "Frontend route `clients` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6c9162acfa5ee47e", "scanner": "scanner-primary", "fingerprint": "b113530310976905", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c6b1063982c47250", "level": "warning", "message": {"text": "Frontend route `invoices` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3b0550ed7e59599d", "scanner": "scanner-primary", "fingerprint": "c6b1063982c47250", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-130f20804b3b07fb", "level": "warning", "message": {"text": "Frontend route `team` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "52c423083ee907e8", "scanner": "scanner-primary", "fingerprint": "130f20804b3b07fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cd9944d8886cdb6c", "level": "warning", "message": {"text": "Frontend route `social` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5669c31265b1c408", "scanner": "scanner-primary", "fingerprint": "cd9944d8886cdb6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1bded507f249edf8", "level": "warning", "message": {"text": "Frontend route `support` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a04869c33efbf3b0", "scanner": "scanner-primary", "fingerprint": "1bded507f249edf8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0626b4c2e4efcb82", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9badda3b3a471962", "scanner": "scanner-primary", "fingerprint": "0626b4c2e4efcb82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9aac4416bc780cf4", "level": "warning", "message": {"text": "Frontend route `upgrade` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7af4bf0ffcb78594", "scanner": "scanner-primary", "fingerprint": "9aac4416bc780cf4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f2d6a2d0bfec57f9", "level": "warning", "message": {"text": "Frontend route `booking-page` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3eccee7688bac987", "scanner": "scanner-primary", "fingerprint": "f2d6a2d0bfec57f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5fb1af8687344f58", "level": "warning", "message": {"text": "Frontend route `agents` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "ad47a7b2133e9e79", "scanner": "scanner-primary", "fingerprint": "5fb1af8687344f58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-497e32deb39c13dd", "level": "warning", "message": {"text": "Frontend route `finance` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9a13fff372caeaea", "scanner": "scanner-primary", "fingerprint": "497e32deb39c13dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-678650e22915763a", "level": "warning", "message": {"text": "Frontend route `tenants` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9a2a6fc88bf28551", "scanner": "scanner-primary", "fingerprint": "678650e22915763a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fea04209d8ae8555", "level": "warning", "message": {"text": "Frontend route `users` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "77ef62fee89e9f10", "scanner": "scanner-primary", "fingerprint": "fea04209d8ae8555", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-243e1841e75a3810", "level": "warning", "message": {"text": "Frontend route `billing` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "11aa2e4bfe7789fd", "scanner": "scanner-primary", "fingerprint": "243e1841e75a3810", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c334727232c15ac9", "level": "warning", "message": {"text": "Frontend route `revenue` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "1208d0b30406a3b5", "scanner": "scanner-primary", "fingerprint": "c334727232c15ac9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9f16b729ca26901e", "level": "warning", "message": {"text": "Frontend route `support-tickets` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a23ee8e0e5b61fa2", "scanner": "scanner-primary", "fingerprint": "9f16b729ca26901e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-59063ae222c06c5d", "level": "warning", "message": {"text": "Frontend route `audit-log` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d570eed4da4bf3f7", "scanner": "scanner-primary", "fingerprint": "59063ae222c06c5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-76c3df96bdc4f90b", "level": "warning", "message": {"text": "Frontend route `admins` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6288231a7529295f", "scanner": "scanner-primary", "fingerprint": "76c3df96bdc4f90b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-41c27407df6dd28c", "level": "warning", "message": {"text": "Frontend route `impersonate/:tenantId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c56e5eb36258e763", "scanner": "scanner-primary", "fingerprint": "41c27407df6dd28c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}