{"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-3b295271658ef8c3", "name": "Possibly dead Python function: replace_copy", "shortDescription": {"text": "Possibly dead Python function: replace_copy"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e600d27f9ff8c53c", "name": "Stray `console.log` in TS/JS \u2014 test-filter.js:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-filter.js:46"}, "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-795a1524538a6ca5", "name": "Stray `console.log` in TS/JS \u2014 scripts/bulk-sync-gigs.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bulk-sync-gigs.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1483e003865cb9d0", "name": "Stray `console.log` in TS/JS \u2014 src/App.tsx:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/App.tsx:144"}, "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-f9ecb9d57b0ea1ab", "name": "Stray `console.log` in TS/JS \u2014 src/utils/csvImport.test.ts:180", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/csvImport.test.ts:180"}, "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-bc870b145c70e89b", "name": "Stray `console.log` in TS/JS \u2014 src/contexts/AuthContext.tsx:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/contexts/AuthContext.tsx:46"}, "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-77a772268193a824", "name": "TODO/FIXME marker in shipping code \u2014 src/types/react-big-calendar.d.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/types/react-big-calendar.d.ts:3"}, "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-a4ad0ca5e14d3d04", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/UserSelector.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/UserSelector.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-1f6e3c3ec4008c09", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AssetScreen.tsx:977", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AssetScreen.tsx:977"}, "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-ab7f3e2e268b6a39", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CalendarScreen.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CalendarScreen.tsx:231"}, "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-b8c8e6dfd8c9b556", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrganizationScreen.tsx:597", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrganizationScreen.tsx:597"}, "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-07eb19acf4ac7a5a", "name": "Stray `console.log` in TS/JS \u2014 src/components/LoginScreen.tsx:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/LoginScreen.tsx:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50ac2a9cdcad3f56", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrganizationSelector.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrganizationSelector.tsx:117"}, "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-b90287a70f6a73f9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/GigListScreen.tsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/GigListScreen.tsx:261"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ca1cda4c6e4a578c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrganizationSelectionScreen.tsx:276", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrganizationSelectionScreen.tsx:276"}, "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-b7d0dab4ea8b8019", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AssetDetailScreen.tsx:427", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AssetDetailScreen.tsx:427"}, "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-37cd22a0e3c12a6d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ConflictWarning.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ConflictWarning.tsx:73"}, "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-263fb0bb0d40fbe1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CalendarIntegrationSettings.tsx:804", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CalendarIntegrationSettings.tsx:804"}, "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-8e36dfe2eeca31bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AttachmentManager.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AttachmentManager.tsx:160"}, "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-1bd8071219eb08e8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/financials/GigAccountingTable.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/financials/GigAccountingTable.tsx:86"}, "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-01a5821408a53d78", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/financials/GigAccountingCardView.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/financials/GigAccountingCardView.tsx:84"}, "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-861329997f805bbe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/inventory/InventorySummaryDashboard.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inventory/InventorySummaryDashboard.tsx:156"}, "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-c988217e1022059e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/gig/GigFinancialsSection.tsx:551", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/gig/GigFinancialsSection.tsx:551"}, "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-56675df112309e77", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tables/GigTable.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tables/GigTable.tsx:180"}, "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-b328ecf4fe923c21", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileGigFinancials.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileGigFinancials.tsx:233"}, "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-1e65f580146e2be2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileGigList.tsx:347", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileGigList.tsx:347"}, "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-c1aa71fc62789064", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileInventoryMode.tsx:456", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileInventoryMode.tsx:456"}, "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-8e96c26af3b94f0b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileSettings.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileSettings.tsx:147"}, "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-827fab6576cb15d4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileDashboard.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileDashboard.tsx:177"}, "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-ab3cfe92de2b2007", "name": "Stray `console.log` in TS/JS \u2014 src/components/mobile/MobileDashboard.tsx:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/mobile/MobileDashboard.tsx:41"}, "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-2d26444eb729851c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileGigDetail.tsx:370", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileGigDetail.tsx:370"}, "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-5d13d7b5f2fa2b8f", "name": "Stray `console.log` in TS/JS \u2014 src/components/mobile/MobileGigDetail.tsx:106", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/mobile/MobileGigDetail.tsx:106"}, "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-5f8b995e940bd55c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:83", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:83"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f2bb049dfffd27e", "name": "Stray `console.log` in TS/JS \u2014 src/services/gig.service.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/gig.service.ts:53"}, "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-d228b2265d69075b", "name": "Stray `console.log` in TS/JS \u2014 src/services/googleCalendar.service.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/googleCalendar.service.ts:69"}, "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-37c6e71ac3643918", "name": "Stray `console.log` in TS/JS \u2014 src/services/mobile/packingList.service.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/mobile/packingList.service.ts:12"}, "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-bb7b3613e412f791", "name": "Possible secret in src/components/UserProfileCompletionScreen.tsx", "shortDescription": {"text": "Possible secret in src/components/UserProfileCompletionScreen.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-6f38a33241735455", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:83", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:83"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7fd878536f2505a1", "name": "Very large file: src/utils/supabase/database.types.ts (1784 lines)", "shortDescription": {"text": "Very large file: src/utils/supabase/database.types.ts (1784 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-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 81 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 204 placeholder/mock markers across 42 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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. 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-fd991708db239497", "name": "Commented-code block (6 lines) in eslint.config.js:25", "shortDescription": {"text": "Commented-code block (6 lines) in eslint.config.js:25"}, "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-f2c61df6e8cc3e00", "name": "Legacy-named symbol `create_purchase_transaction_v1` in src/utils/supabase/database.types.ts:1379", "shortDescription": {"text": "Legacy-named symbol `create_purchase_transaction_v1` in src/utils/supabase/database.types.ts:1379"}, "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-1a685e298060df6f", "name": "Legacy-named symbol `create_purchase_transaction_v1` in src/services/purchase.service.test.ts:88", "shortDescription": {"text": "Legacy-named symbol `create_purchase_transaction_v1` in src/services/purchase.service.test.ts:88"}, "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-6f0f014b7a223f6c", "name": "Legacy-named symbol `create_purchase_transaction_v1` in src/services/purchase.service.ts:375", "shortDescription": {"text": "Legacy-named symbol `create_purchase_transaction_v1` in src/services/purchase.service.ts:375"}, "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-5843446e2429424e", "name": "Legacy-named symbol `replace_copy` in supabase/dump/convert_seed.py:16", "shortDescription": {"text": "Legacy-named symbol `replace_copy` in supabase/dump/convert_seed.py:16"}, "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-88e15b9643fbaba3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/server/index.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/server/index.ts:60"}, "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-9bf9f5b1275dcef7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/server/routes/places.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/server/routes/places.ts:33"}, "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-b86d03aabf2f73f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/server/routes/calendar.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/server/routes/calendar.ts:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3482f7e5dd70cd1a", "name": "6 env vars used in code but missing from .env.example", "shortDescription": {"text": "6 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEV`, `GIGMANAGER_PROCESSED_DIR`, `MODE`, `SYNC_USER_EMAIL`, `SYNC_USER_PASSWORD`, `VITE_HTTPS`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d12ac5f93b39a59", "name": "Dangling fetch: POST https://places.googleapis.com/v1/places:searchText (supabase/functions/server/routes/places.ts:33)", "shortDescription": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:searchText (supabase/functions/server/routes/places.ts:33)"}, "fullDescription": {"text": "`supabase/functions/server/routes/places.ts:33` calls `POST https://places.googleapis.com/v1/places:searchText` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/places.googleapis.com/v1/places/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b224540bd7118f97", "name": "Dangling fetch: GET https://places.googleapis.com/v1/places/${placeId} (supabase/functions/server/routes/places.ts:97)", "shortDescription": {"text": "Dangling fetch: GET https://places.googleapis.com/v1/places/${placeId} (supabase/functions/server/routes/places.ts:97)"}, "fullDescription": {"text": "`supabase/functions/server/routes/places.ts:97` calls `GET https://places.googleapis.com/v1/places/${placeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/places.googleapis.com/v1/places/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-afc50a949c52dd39", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (supabase/functions/server/routes/calendar.ts:20)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (supabase/functions/server/routes/calendar.ts:20)"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts:20` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8f558e62487f0c75", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (supabase/functions/server/routes/calendar.ts:43)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (supabase/functions/server/routes/calendar.ts:43)"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts:43` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-be93ce319e24e9d9", "name": "Dangling fetch: GET https://www.googleapis.com/calendar/v3/users/me/calendarList (supabase/functions/server/routes/calen", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/calendar/v3/users/me/calendarList (supabase/functions/server/routes/calendar.ts:61)"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts:61` calls `GET https://www.googleapis.com/calendar/v3/users/me/calendarList` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/calendar/v3/users/me/calendarlist`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e283b0d07567df0", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (supabase/functions/server/routes/calendar.ts:197)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (supabase/functions/server/routes/calendar.ts:197)"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts:197` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1bca8100a44f7f25", "name": "Unused endpoint: POST /users", "shortDescription": {"text": "Unused endpoint: POST /users"}, "fullDescription": {"text": "`supabase/functions/server/routes/users.ts` declares `POST /users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-841e50bf821e4158", "name": "Unused endpoint: GET /users", "shortDescription": {"text": "Unused endpoint: GET /users"}, "fullDescription": {"text": "`supabase/functions/server/routes/users.ts` declares `GET /users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41aa9e92da3f14ad", "name": "Unused endpoint: GET /users/:id", "shortDescription": {"text": "Unused endpoint: GET /users/:id"}, "fullDescription": {"text": "`supabase/functions/server/routes/users.ts` declares `GET /users/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bdd9111e1cbd2899", "name": "Unused endpoint: PUT /users/:id", "shortDescription": {"text": "Unused endpoint: PUT /users/:id"}, "fullDescription": {"text": "`supabase/functions/server/routes/users.ts` declares `PUT /users/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffbb8134e62fb5ab", "name": "Unused endpoint: GET /users/:id/organizations", "shortDescription": {"text": "Unused endpoint: GET /users/:id/organizations"}, "fullDescription": {"text": "`supabase/functions/server/routes/users.ts` declares `GET /users/:id/organizations` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eed9fa512f6dd909", "name": "Unused endpoint: GET /integrations/google-places/search", "shortDescription": {"text": "Unused endpoint: GET /integrations/google-places/search"}, "fullDescription": {"text": "`supabase/functions/server/routes/places.ts` declares `GET /integrations/google-places/search` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-579c87738249de56", "name": "Unused endpoint: GET /integrations/google-places/:placeId{.+}", "shortDescription": {"text": "Unused endpoint: GET /integrations/google-places/:placeId{.+}"}, "fullDescription": {"text": "`supabase/functions/server/routes/places.ts` declares `GET /integrations/google-places/:placeId{.+}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2e80f766ca513362", "name": "Unused endpoint: POST /webauthn/register/options", "shortDescription": {"text": "Unused endpoint: POST /webauthn/register/options"}, "fullDescription": {"text": "`supabase/functions/server/routes/webauthn.ts` declares `POST /webauthn/register/options` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15215d8c284261c5", "name": "Unused endpoint: POST /webauthn/register/verify", "shortDescription": {"text": "Unused endpoint: POST /webauthn/register/verify"}, "fullDescription": {"text": "`supabase/functions/server/routes/webauthn.ts` declares `POST /webauthn/register/verify` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-489e879d354489dd", "name": "Unused endpoint: POST /webauthn/authenticate/options", "shortDescription": {"text": "Unused endpoint: POST /webauthn/authenticate/options"}, "fullDescription": {"text": "`supabase/functions/server/routes/webauthn.ts` declares `POST /webauthn/authenticate/options` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de53e3890ba3ea19", "name": "Unused endpoint: POST /webauthn/authenticate/verify", "shortDescription": {"text": "Unused endpoint: POST /webauthn/authenticate/verify"}, "fullDescription": {"text": "`supabase/functions/server/routes/webauthn.ts` declares `POST /webauthn/authenticate/verify` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e04e7a412cebe555", "name": "Unused endpoint: POST /integrations/google-calendar/exchange-token", "shortDescription": {"text": "Unused endpoint: POST /integrations/google-calendar/exchange-token"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts` declares `POST /integrations/google-calendar/exchange-token` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-84162058eb0cccbe", "name": "Unused endpoint: POST /integrations/google-calendar/refresh-token", "shortDescription": {"text": "Unused endpoint: POST /integrations/google-calendar/refresh-token"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts` declares `POST /integrations/google-calendar/refresh-token` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a317f7d97b3b050a", "name": "Unused endpoint: POST /integrations/google-calendar/calendars", "shortDescription": {"text": "Unused endpoint: POST /integrations/google-calendar/calendars"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts` declares `POST /integrations/google-calendar/calendars` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-241692d930692da2", "name": "Unused endpoint: POST /integrations/google-calendar/events", "shortDescription": {"text": "Unused endpoint: POST /integrations/google-calendar/events"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts` declares `POST /integrations/google-calendar/events` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ce49e04ad9464f4", "name": "Unused endpoint: DELETE /integrations/google-calendar/events", "shortDescription": {"text": "Unused endpoint: DELETE /integrations/google-calendar/events"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts` declares `DELETE /integrations/google-calendar/events` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17f4b94edda01bdb", "name": "Unused endpoint: POST /integrations/google-calendar/sync-gig-all-users", "shortDescription": {"text": "Unused endpoint: POST /integrations/google-calendar/sync-gig-all-users"}, "fullDescription": {"text": "`supabase/functions/server/routes/calendar.ts` declares `POST /integrations/google-calendar/sync-gig-all-users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1309fc526d7c477", "name": "Unused endpoint: GET /gigs", "shortDescription": {"text": "Unused endpoint: GET /gigs"}, "fullDescription": {"text": "`supabase/functions/server/routes/gigs.ts` declares `GET /gigs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-95c209a9a3d4494d", "name": "Unused endpoint: GET /gigs/:id", "shortDescription": {"text": "Unused endpoint: GET /gigs/:id"}, "fullDescription": {"text": "`supabase/functions/server/routes/gigs.ts` declares `GET /gigs/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c93eefb1d13b371e", "name": "Unused endpoint: POST /gigs", "shortDescription": {"text": "Unused endpoint: POST /gigs"}, "fullDescription": {"text": "`supabase/functions/server/routes/gigs.ts` declares `POST /gigs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f6be054765a92e7", "name": "Unused endpoint: PUT /gigs/:id", "shortDescription": {"text": "Unused endpoint: PUT /gigs/:id"}, "fullDescription": {"text": "`supabase/functions/server/routes/gigs.ts` declares `PUT /gigs/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d269f871a981bfa", "name": "Unused endpoint: DELETE /gigs/:id", "shortDescription": {"text": "Unused endpoint: DELETE /gigs/:id"}, "fullDescription": {"text": "`supabase/functions/server/routes/gigs.ts` declares `DELETE /gigs/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0685cd88fe4d489", "name": "Unused endpoint: GET /organizations/:id/dashboard", "shortDescription": {"text": "Unused endpoint: GET /organizations/:id/dashboard"}, "fullDescription": {"text": "`supabase/functions/server/routes/gigs.ts` declares `GET /organizations/:id/dashboard` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a12d652045da70a", "name": "Unused endpoint: GET /organizations", "shortDescription": {"text": "Unused endpoint: GET /organizations"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `GET /organizations` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f4d79b4eee1da9b6", "name": "Unused endpoint: POST /organizations", "shortDescription": {"text": "Unused endpoint: POST /organizations"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `POST /organizations` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab70170cd19e9f75", "name": "Unused endpoint: PUT /organizations/:id", "shortDescription": {"text": "Unused endpoint: PUT /organizations/:id"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `PUT /organizations/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ce45ef3da10bf14", "name": "Unused endpoint: DELETE /organizations/:id", "shortDescription": {"text": "Unused endpoint: DELETE /organizations/:id"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `DELETE /organizations/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35137edfe76e1bf3", "name": "Unused endpoint: POST /organizations/:id/members", "shortDescription": {"text": "Unused endpoint: POST /organizations/:id/members"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `POST /organizations/:id/members` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4cf187386bbf4ccd", "name": "Unused endpoint: GET /organizations/:id/members", "shortDescription": {"text": "Unused endpoint: GET /organizations/:id/members"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `GET /organizations/:id/members` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-059741539f450d2d", "name": "Unused endpoint: GET /organizations/:id/members/:memberId", "shortDescription": {"text": "Unused endpoint: GET /organizations/:id/members/:memberId"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `GET /organizations/:id/members/:memberId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-10ad43eb882f0efa", "name": "Unused endpoint: PUT /organizations/:id/members/:memberId", "shortDescription": {"text": "Unused endpoint: PUT /organizations/:id/members/:memberId"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `PUT /organizations/:id/members/:memberId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87b2e44e1173b8c3", "name": "Unused endpoint: DELETE /organizations/:id/members/:memberId", "shortDescription": {"text": "Unused endpoint: DELETE /organizations/:id/members/:memberId"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `DELETE /organizations/:id/members/:memberId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e642e47837ea3b38", "name": "Unused endpoint: DELETE /invitations/:invitationId", "shortDescription": {"text": "Unused endpoint: DELETE /invitations/:invitationId"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `DELETE /invitations/:invitationId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-885763bd05ce2f06", "name": "Unused endpoint: POST /organizations/:id/invitations", "shortDescription": {"text": "Unused endpoint: POST /organizations/:id/invitations"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `POST /organizations/:id/invitations` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-455b4dd0678dc834", "name": "Unused endpoint: POST /organizations/:id/members/create", "shortDescription": {"text": "Unused endpoint: POST /organizations/:id/members/create"}, "fullDescription": {"text": "`supabase/functions/server/routes/organizations.ts` declares `POST /organizations/:id/members/create` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/25094"}, "properties": {"repository": "corourke/GigManager", "repoUrl": "https://github.com/corourke/GigManager", "branch": "main"}, "results": [{"ruleId": "scanner-3b295271658ef8c3", "level": "note", "message": {"text": "Possibly dead Python function: replace_copy"}, "properties": {"repobilityId": "671f6a9d5afadeda", "scanner": "scanner-primary", "fingerprint": "3b295271658ef8c3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/dump/convert_seed.py:16"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e600d27f9ff8c53c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-filter.js:46"}, "properties": {"repobilityId": "6f1a685cceb48bc2", "scanner": "scanner-primary", "fingerprint": "e600d27f9ff8c53c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-795a1524538a6ca5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bulk-sync-gigs.ts:31"}, "properties": {"repobilityId": "0d77c2fcab59fac6", "scanner": "scanner-primary", "fingerprint": "795a1524538a6ca5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1483e003865cb9d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/App.tsx:144"}, "properties": {"repobilityId": "f3d63003b5dbefbd", "scanner": "scanner-primary", "fingerprint": "1483e003865cb9d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9ecb9d57b0ea1ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/csvImport.test.ts:180"}, "properties": {"repobilityId": "00c546717c74911c", "scanner": "scanner-primary", "fingerprint": "f9ecb9d57b0ea1ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc870b145c70e89b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/contexts/AuthContext.tsx:46"}, "properties": {"repobilityId": "b0560e613f912695", "scanner": "scanner-primary", "fingerprint": "bc870b145c70e89b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77a772268193a824", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/types/react-big-calendar.d.ts:3"}, "properties": {"repobilityId": "fd8210e5ed269fc4", "scanner": "scanner-primary", "fingerprint": "77a772268193a824", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a4ad0ca5e14d3d04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/UserSelector.tsx:114"}, "properties": {"repobilityId": "ca27cf4e7f809e2a", "scanner": "scanner-primary", "fingerprint": "a4ad0ca5e14d3d04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f6e3c3ec4008c09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AssetScreen.tsx:977"}, "properties": {"repobilityId": "55227e4f40bb1d09", "scanner": "scanner-primary", "fingerprint": "1f6e3c3ec4008c09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab7f3e2e268b6a39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CalendarScreen.tsx:231"}, "properties": {"repobilityId": "8dad5fcc4db0cf7d", "scanner": "scanner-primary", "fingerprint": "ab7f3e2e268b6a39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8c8e6dfd8c9b556", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrganizationScreen.tsx:597"}, "properties": {"repobilityId": "a21418392acd41d2", "scanner": "scanner-primary", "fingerprint": "b8c8e6dfd8c9b556", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07eb19acf4ac7a5a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/LoginScreen.tsx:28"}, "properties": {"repobilityId": "2759f5338f0f945b", "scanner": "scanner-primary", "fingerprint": "07eb19acf4ac7a5a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-50ac2a9cdcad3f56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrganizationSelector.tsx:117"}, "properties": {"repobilityId": "33d0bd8b556ecda5", "scanner": "scanner-primary", "fingerprint": "50ac2a9cdcad3f56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b90287a70f6a73f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/GigListScreen.tsx:261"}, "properties": {"repobilityId": "6b59344ddb9037f9", "scanner": "scanner-primary", "fingerprint": "b90287a70f6a73f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca1cda4c6e4a578c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrganizationSelectionScreen.tsx:276"}, "properties": {"repobilityId": "0c3c0bd44b061d82", "scanner": "scanner-primary", "fingerprint": "ca1cda4c6e4a578c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b7d0dab4ea8b8019", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AssetDetailScreen.tsx:427"}, "properties": {"repobilityId": "4da46cc01664a513", "scanner": "scanner-primary", "fingerprint": "b7d0dab4ea8b8019", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37cd22a0e3c12a6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ConflictWarning.tsx:73"}, "properties": {"repobilityId": "c66181fa8098090c", "scanner": "scanner-primary", "fingerprint": "37cd22a0e3c12a6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-263fb0bb0d40fbe1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CalendarIntegrationSettings.tsx:804"}, "properties": {"repobilityId": "fa489fd3ccdb1502", "scanner": "scanner-primary", "fingerprint": "263fb0bb0d40fbe1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e36dfe2eeca31bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AttachmentManager.tsx:160"}, "properties": {"repobilityId": "8a4caa0065b46dad", "scanner": "scanner-primary", "fingerprint": "8e36dfe2eeca31bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bd8071219eb08e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/financials/GigAccountingTable.tsx:86"}, "properties": {"repobilityId": "9c644928aca43f87", "scanner": "scanner-primary", "fingerprint": "1bd8071219eb08e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01a5821408a53d78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/financials/GigAccountingCardView.tsx:84"}, "properties": {"repobilityId": "81ff0e8cf3daa562", "scanner": "scanner-primary", "fingerprint": "01a5821408a53d78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-861329997f805bbe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inventory/InventorySummaryDashboard.tsx:156"}, "properties": {"repobilityId": "c245e1b43ada88b8", "scanner": "scanner-primary", "fingerprint": "861329997f805bbe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c988217e1022059e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/gig/GigFinancialsSection.tsx:551"}, "properties": {"repobilityId": "3fbe6a8c392012eb", "scanner": "scanner-primary", "fingerprint": "c988217e1022059e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56675df112309e77", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tables/GigTable.tsx:180"}, "properties": {"repobilityId": "f0bbd669eef31260", "scanner": "scanner-primary", "fingerprint": "56675df112309e77", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b328ecf4fe923c21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileGigFinancials.tsx:233"}, "properties": {"repobilityId": "349dfa44c7245d72", "scanner": "scanner-primary", "fingerprint": "b328ecf4fe923c21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e65f580146e2be2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileGigList.tsx:347"}, "properties": {"repobilityId": "dbc0ccd41d5bc462", "scanner": "scanner-primary", "fingerprint": "1e65f580146e2be2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1aa71fc62789064", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileInventoryMode.tsx:456"}, "properties": {"repobilityId": "4b43d3c8afff40d7", "scanner": "scanner-primary", "fingerprint": "c1aa71fc62789064", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e96c26af3b94f0b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileSettings.tsx:147"}, "properties": {"repobilityId": "0972e51a4a2fe6fc", "scanner": "scanner-primary", "fingerprint": "8e96c26af3b94f0b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-827fab6576cb15d4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileDashboard.tsx:177"}, "properties": {"repobilityId": "f46a566dbce05228", "scanner": "scanner-primary", "fingerprint": "827fab6576cb15d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab3cfe92de2b2007", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/mobile/MobileDashboard.tsx:41"}, "properties": {"repobilityId": "1e5a33c36dbb531b", "scanner": "scanner-primary", "fingerprint": "ab3cfe92de2b2007", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2d26444eb729851c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mobile/MobileGigDetail.tsx:370"}, "properties": {"repobilityId": "e0e01c36a89e8460", "scanner": "scanner-primary", "fingerprint": "2d26444eb729851c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d13d7b5f2fa2b8f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/mobile/MobileGigDetail.tsx:106"}, "properties": {"repobilityId": "fac988fd435f222f", "scanner": "scanner-primary", "fingerprint": "5d13d7b5f2fa2b8f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f8b995e940bd55c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:83"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "5f8b995e940bd55c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7f2bb049dfffd27e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/gig.service.ts:53"}, "properties": {"repobilityId": "b7c394a0acfd0bcd", "scanner": "scanner-primary", "fingerprint": "7f2bb049dfffd27e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d228b2265d69075b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/googleCalendar.service.ts:69"}, "properties": {"repobilityId": "68a5d467dd28eaf2", "scanner": "scanner-primary", "fingerprint": "d228b2265d69075b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-37c6e71ac3643918", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/mobile/packingList.service.ts:12"}, "properties": {"repobilityId": "f28bd51223ee98cc", "scanner": "scanner-primary", "fingerprint": "37c6e71ac3643918", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb7b3613e412f791", "level": "error", "message": {"text": "Possible secret in src/components/UserProfileCompletionScreen.tsx"}, "properties": {"repobilityId": "fe3edab7f6e46032", "scanner": "scanner-primary", "fingerprint": "bb7b3613e412f791", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/UserProfileCompletionScreen.tsx"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-6f38a33241735455", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:83"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "6f38a33241735455", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-7fd878536f2505a1", "level": "note", "message": {"text": "Very large file: src/utils/supabase/database.types.ts (1784 lines)"}, "properties": {"repobilityId": "a65724e73fcc5f8c", "scanner": "scanner-primary", "fingerprint": "7fd878536f2505a1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "0e2301da9232300d", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "213623956b1d9f6e", "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": "ab10aa801bf45fed", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "da447cc45cccb3f7", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "fe63838526fd0d85", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-fd991708db239497", "level": "none", "message": {"text": "Commented-code block (6 lines) in eslint.config.js:25"}, "properties": {"repobilityId": "4995bc5db0a25d13", "scanner": "scanner-primary", "fingerprint": "fd991708db239497", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2c61df6e8cc3e00", "level": "note", "message": {"text": "Legacy-named symbol `create_purchase_transaction_v1` in src/utils/supabase/database.types.ts:1379"}, "properties": {"repobilityId": "0c8d456047b7f06b", "scanner": "scanner-primary", "fingerprint": "f2c61df6e8cc3e00", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1a685e298060df6f", "level": "note", "message": {"text": "Legacy-named symbol `create_purchase_transaction_v1` in src/services/purchase.service.test.ts:88"}, "properties": {"repobilityId": "e6978cce016b8298", "scanner": "scanner-primary", "fingerprint": "1a685e298060df6f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6f0f014b7a223f6c", "level": "note", "message": {"text": "Legacy-named symbol `create_purchase_transaction_v1` in src/services/purchase.service.ts:375"}, "properties": {"repobilityId": "07d219d55c184dee", "scanner": "scanner-primary", "fingerprint": "6f0f014b7a223f6c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5843446e2429424e", "level": "note", "message": {"text": "Legacy-named symbol `replace_copy` in supabase/dump/convert_seed.py:16"}, "properties": {"repobilityId": "16cf28c73eb82bbb", "scanner": "scanner-primary", "fingerprint": "5843446e2429424e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-88e15b9643fbaba3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/server/index.ts:60"}, "properties": {"repobilityId": "d123a9727306c38c", "scanner": "scanner-primary", "fingerprint": "88e15b9643fbaba3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9bf9f5b1275dcef7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/server/routes/places.ts:33"}, "properties": {"repobilityId": "b80874a5d7e4763f", "scanner": "scanner-primary", "fingerprint": "9bf9f5b1275dcef7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b86d03aabf2f73f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/server/routes/calendar.ts:20"}, "properties": {"repobilityId": "e1b0505620716a90", "scanner": "scanner-primary", "fingerprint": "b86d03aabf2f73f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3482f7e5dd70cd1a", "level": "note", "message": {"text": "6 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "1da70f25aa46f6e9", "scanner": "scanner-primary", "fingerprint": "3482f7e5dd70cd1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-1d12ac5f93b39a59", "level": "error", "message": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:searchText (supabase/functions/server/routes/places.ts:33)"}, "properties": {"repobilityId": "a47ae304192024a2", "scanner": "scanner-primary", "fingerprint": "1d12ac5f93b39a59", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b224540bd7118f97", "level": "error", "message": {"text": "Dangling fetch: GET https://places.googleapis.com/v1/places/${placeId} (supabase/functions/server/routes/places.ts:97)"}, "properties": {"repobilityId": "3ebd8758dc396f77", "scanner": "scanner-primary", "fingerprint": "b224540bd7118f97", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-afc50a949c52dd39", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (supabase/functions/server/routes/calendar.ts:20)"}, "properties": {"repobilityId": "9ce828abda42d8c6", "scanner": "scanner-primary", "fingerprint": "afc50a949c52dd39", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8f558e62487f0c75", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (supabase/functions/server/routes/calendar.ts:43)"}, "properties": {"repobilityId": "f740bf0e8b1e1ccd", "scanner": "scanner-primary", "fingerprint": "8f558e62487f0c75", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-be93ce319e24e9d9", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/calendar/v3/users/me/calendarList (supabase/functions/server/routes/calendar.ts:61)"}, "properties": {"repobilityId": "8c36041810ccb351", "scanner": "scanner-primary", "fingerprint": "be93ce319e24e9d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e283b0d07567df0", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (supabase/functions/server/routes/calendar.ts:197)"}, "properties": {"repobilityId": "55d3da581e7fa2c2", "scanner": "scanner-primary", "fingerprint": "3e283b0d07567df0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1bca8100a44f7f25", "level": "note", "message": {"text": "Unused endpoint: POST /users"}, "properties": {"repobilityId": "5fa8c294f406eb3e", "scanner": "scanner-primary", "fingerprint": "1bca8100a44f7f25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-841e50bf821e4158", "level": "note", "message": {"text": "Unused endpoint: GET /users"}, "properties": {"repobilityId": "8603aef621bf5c97", "scanner": "scanner-primary", "fingerprint": "841e50bf821e4158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41aa9e92da3f14ad", "level": "note", "message": {"text": "Unused endpoint: GET /users/:id"}, "properties": {"repobilityId": "32a48b4121b0ac8c", "scanner": "scanner-primary", "fingerprint": "41aa9e92da3f14ad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bdd9111e1cbd2899", "level": "note", "message": {"text": "Unused endpoint: PUT /users/:id"}, "properties": {"repobilityId": "a2b0d9176a842251", "scanner": "scanner-primary", "fingerprint": "bdd9111e1cbd2899", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffbb8134e62fb5ab", "level": "note", "message": {"text": "Unused endpoint: GET /users/:id/organizations"}, "properties": {"repobilityId": "3f808e0d44e99f67", "scanner": "scanner-primary", "fingerprint": "ffbb8134e62fb5ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eed9fa512f6dd909", "level": "note", "message": {"text": "Unused endpoint: GET /integrations/google-places/search"}, "properties": {"repobilityId": "fde2cde180f2b02f", "scanner": "scanner-primary", "fingerprint": "eed9fa512f6dd909", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-579c87738249de56", "level": "note", "message": {"text": "Unused endpoint: GET /integrations/google-places/:placeId{.+}"}, "properties": {"repobilityId": "b5a039fba7e71e16", "scanner": "scanner-primary", "fingerprint": "579c87738249de56", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e80f766ca513362", "level": "note", "message": {"text": "Unused endpoint: POST /webauthn/register/options"}, "properties": {"repobilityId": "ebd7e9333af81186", "scanner": "scanner-primary", "fingerprint": "2e80f766ca513362", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-15215d8c284261c5", "level": "note", "message": {"text": "Unused endpoint: POST /webauthn/register/verify"}, "properties": {"repobilityId": "20188d6d069a073f", "scanner": "scanner-primary", "fingerprint": "15215d8c284261c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-489e879d354489dd", "level": "note", "message": {"text": "Unused endpoint: POST /webauthn/authenticate/options"}, "properties": {"repobilityId": "66023398013d5cb3", "scanner": "scanner-primary", "fingerprint": "489e879d354489dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de53e3890ba3ea19", "level": "note", "message": {"text": "Unused endpoint: POST /webauthn/authenticate/verify"}, "properties": {"repobilityId": "3c45753df0c6c3e5", "scanner": "scanner-primary", "fingerprint": "de53e3890ba3ea19", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e04e7a412cebe555", "level": "note", "message": {"text": "Unused endpoint: POST /integrations/google-calendar/exchange-token"}, "properties": {"repobilityId": "df33175ac4e1617f", "scanner": "scanner-primary", "fingerprint": "e04e7a412cebe555", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84162058eb0cccbe", "level": "note", "message": {"text": "Unused endpoint: POST /integrations/google-calendar/refresh-token"}, "properties": {"repobilityId": "5195164fe43fc33a", "scanner": "scanner-primary", "fingerprint": "84162058eb0cccbe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a317f7d97b3b050a", "level": "note", "message": {"text": "Unused endpoint: POST /integrations/google-calendar/calendars"}, "properties": {"repobilityId": "f4bb3eb5691fe220", "scanner": "scanner-primary", "fingerprint": "a317f7d97b3b050a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-241692d930692da2", "level": "note", "message": {"text": "Unused endpoint: POST /integrations/google-calendar/events"}, "properties": {"repobilityId": "343842caaa05094e", "scanner": "scanner-primary", "fingerprint": "241692d930692da2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ce49e04ad9464f4", "level": "note", "message": {"text": "Unused endpoint: DELETE /integrations/google-calendar/events"}, "properties": {"repobilityId": "ef984246e9c07036", "scanner": "scanner-primary", "fingerprint": "5ce49e04ad9464f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17f4b94edda01bdb", "level": "note", "message": {"text": "Unused endpoint: POST /integrations/google-calendar/sync-gig-all-users"}, "properties": {"repobilityId": "36408bc6f0541082", "scanner": "scanner-primary", "fingerprint": "17f4b94edda01bdb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1309fc526d7c477", "level": "note", "message": {"text": "Unused endpoint: GET /gigs"}, "properties": {"repobilityId": "e750cd13d11d5353", "scanner": "scanner-primary", "fingerprint": "f1309fc526d7c477", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-95c209a9a3d4494d", "level": "note", "message": {"text": "Unused endpoint: GET /gigs/:id"}, "properties": {"repobilityId": "fc239e79d1b38f88", "scanner": "scanner-primary", "fingerprint": "95c209a9a3d4494d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c93eefb1d13b371e", "level": "note", "message": {"text": "Unused endpoint: POST /gigs"}, "properties": {"repobilityId": "4f20394adc0cf243", "scanner": "scanner-primary", "fingerprint": "c93eefb1d13b371e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f6be054765a92e7", "level": "note", "message": {"text": "Unused endpoint: PUT /gigs/:id"}, "properties": {"repobilityId": "22f42092494e01ce", "scanner": "scanner-primary", "fingerprint": "2f6be054765a92e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1d269f871a981bfa", "level": "note", "message": {"text": "Unused endpoint: DELETE /gigs/:id"}, "properties": {"repobilityId": "efe25eb9c9ecab51", "scanner": "scanner-primary", "fingerprint": "1d269f871a981bfa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0685cd88fe4d489", "level": "note", "message": {"text": "Unused endpoint: GET /organizations/:id/dashboard"}, "properties": {"repobilityId": "42e83be75d3d5a7b", "scanner": "scanner-primary", "fingerprint": "e0685cd88fe4d489", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a12d652045da70a", "level": "note", "message": {"text": "Unused endpoint: GET /organizations"}, "properties": {"repobilityId": "a0771b549df9b3c5", "scanner": "scanner-primary", "fingerprint": "7a12d652045da70a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4d79b4eee1da9b6", "level": "note", "message": {"text": "Unused endpoint: POST /organizations"}, "properties": {"repobilityId": "79703a7af028031b", "scanner": "scanner-primary", "fingerprint": "f4d79b4eee1da9b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab70170cd19e9f75", "level": "note", "message": {"text": "Unused endpoint: PUT /organizations/:id"}, "properties": {"repobilityId": "0c5afdd92bba8281", "scanner": "scanner-primary", "fingerprint": "ab70170cd19e9f75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ce45ef3da10bf14", "level": "note", "message": {"text": "Unused endpoint: DELETE /organizations/:id"}, "properties": {"repobilityId": "ff3ab89f717f1dbb", "scanner": "scanner-primary", "fingerprint": "9ce45ef3da10bf14", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-35137edfe76e1bf3", "level": "note", "message": {"text": "Unused endpoint: POST /organizations/:id/members"}, "properties": {"repobilityId": "39d158becc056ca4", "scanner": "scanner-primary", "fingerprint": "35137edfe76e1bf3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4cf187386bbf4ccd", "level": "note", "message": {"text": "Unused endpoint: GET /organizations/:id/members"}, "properties": {"repobilityId": "09c000d5396fb247", "scanner": "scanner-primary", "fingerprint": "4cf187386bbf4ccd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-059741539f450d2d", "level": "note", "message": {"text": "Unused endpoint: GET /organizations/:id/members/:memberId"}, "properties": {"repobilityId": "109aa724fde2d184", "scanner": "scanner-primary", "fingerprint": "059741539f450d2d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-10ad43eb882f0efa", "level": "note", "message": {"text": "Unused endpoint: PUT /organizations/:id/members/:memberId"}, "properties": {"repobilityId": "7d946e86663be31a", "scanner": "scanner-primary", "fingerprint": "10ad43eb882f0efa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-87b2e44e1173b8c3", "level": "note", "message": {"text": "Unused endpoint: DELETE /organizations/:id/members/:memberId"}, "properties": {"repobilityId": "2a229841a793e343", "scanner": "scanner-primary", "fingerprint": "87b2e44e1173b8c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e642e47837ea3b38", "level": "note", "message": {"text": "Unused endpoint: DELETE /invitations/:invitationId"}, "properties": {"repobilityId": "e559fa4313c160ef", "scanner": "scanner-primary", "fingerprint": "e642e47837ea3b38", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-885763bd05ce2f06", "level": "note", "message": {"text": "Unused endpoint: POST /organizations/:id/invitations"}, "properties": {"repobilityId": "5fc1d16f749af1a7", "scanner": "scanner-primary", "fingerprint": "885763bd05ce2f06", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-455b4dd0678dc834", "level": "note", "message": {"text": "Unused endpoint: POST /organizations/:id/members/create"}, "properties": {"repobilityId": "0c1378530d1edefd", "scanner": "scanner-primary", "fingerprint": "455b4dd0678dc834", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}