{"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-5d6fe450d3f62b78", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/client/src/components/documents/document-upload-modal.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/client/src/components/documents/document-upload-modal.tsx:234"}, "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-f12846d1b473e230", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/client/src/app/(dashboard)/page.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/client/src/app/(dashboard)/page.tsx:308"}, "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-f45ee236bccdc4f0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/client/src/app/(dashboard)/documents/page.tsx:251", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/client/src/app/(dashboard)/documents/page.tsx:251"}, "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-2ad79487684a0307", "name": "TODO/FIXME marker in shipping code \u2014 apps/client/src/app/(dashboard)/preferences/page.tsx:6", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/client/src/app/(dashboard)/preferences/page.tsx:6"}, "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-73262d5fb4c26c24", "name": "TODO/FIXME marker in shipping code \u2014 apps/api/src/auth/guards/mfa.guard.ts:63", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/auth/guards/mfa.guard.ts:63"}, "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-b2c00c7f6b41bbff", "name": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/activity-media.controller.ts:972", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/activity-media.controller.ts:972"}, "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-1285eac98c053968", "name": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/activity-documents.controller.ts:270", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/activity-documents.controller.ts:270"}, "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-fa54b968ce58f3e9", "name": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/__tests__/reference-numbers.spec.ts:81", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/__tests__/reference-numbers.spec.ts:81"}, "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-bd8e4bdfa0ba7503", "name": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/__tests__/trips-workflow.spec.ts:97", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/__tests__/trips-workflow.spec.ts:97"}, "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-ba72efd2665faf55", "name": "TODO/FIXME marker in shipping code \u2014 apps/api/src/ic-payouts/notifications/ic-payout-notifications.service.ts:472", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/ic-payouts/notifications/ic-payout-notifications.service.ts:472"}, "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-c95644911fc9bdc3", "name": "TODO/FIXME marker in shipping code \u2014 apps/api/src/ic-payouts/ic-tax-profiles/ic-tax-profiles.service.ts:121", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/ic-payouts/ic-tax-profiles/ic-tax-profiles.service.ts:121"}, "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-6f69a7d87068db4d", "name": "TODO/FIXME marker in shipping code \u2014 apps/api/src/ic-payouts/payout-accounts/ic-payout-accounts.service.ts:142", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/ic-payouts/payout-accounts/ic-payout-accounts.service.ts:142"}, "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-1677d4cbff4a2dd6", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/storage/providers/__tests__/r2-media-integration.test.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/storage/providers/__tests__/r2-media-integration.test.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a7a0d7961795f4c", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/storage/providers/__tests__/backblaze-b2.provider.integration.spec.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/storage/providers/__tests__/backblaze-b2.provider.integration.spec.ts:58"}, "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-390ed9212f983fdb", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/storage/providers/__tests__/r2-integration.test.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/storage/providers/__tests__/r2-integration.test.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-2aa32e34e4efd842", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/cascade-confirmation-dialog.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/cascade-confirmation-dialog.tsx:108"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dcbf801f8e068659", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/file-preview-modal.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/file-preview-modal.tsx:132"}, "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-541a58dc87ef7b4e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/hotel-search-panel.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/hotel-search-panel.tsx:186"}, "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-71678d7899e4196f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/activity-search-panel.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/activity-search-panel.tsx:165"}, "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-af128ff965c5204e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transfer-search-panel.tsx:354", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transfer-search-panel.tsx:354"}, "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-24fef1361fd8553a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/media-uploader.tsx:686", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/media-uploader.tsx:686"}, "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-c92bface643690dc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/layout/super-search-dialog.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/layout/super-search-dialog.tsx:100"}, "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-e23054108af4b134", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/library/add-to-trip-dialog.tsx:404", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/library/add-to-trip-dialog.tsx:404"}, "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-430c4a4c88de1f8f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/trips/MoveToGroupDialog.tsx:282", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/trips/MoveToGroupDialog.tsx:282"}, "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-d2f1a91e7e234e17", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/shared/component-media-tab.tsx:419", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/shared/component-media-tab.tsx:419"}, "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-ea555fa933fe7dd4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/flight-journey-display.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/flight-journey-display.tsx:157"}, "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-62df4d811f3969a6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/airport-autocomplete.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/airport-autocomplete.tsx:181"}, "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-cecdb4619d4a7368", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/flight-search-result-card.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/flight-search-result-card.tsx:209"}, "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-00b8560941fd6f27", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/transport-journey-display.tsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/transport-journey-display.tsx:241"}, "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-f1a06135fe7a9811", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/airline-autocomplete.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/airline-autocomplete.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-c3df7e6bee5ec18b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/combobox.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/combobox.tsx:104"}, "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-c7a8d99142c99b5a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/packages/packages-list.tsx:727", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/packages/packages-list.tsx:727"}, "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-0c4f8385aeb82d1b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/packages/activity-linker-sheet.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/packages/activity-linker-sheet.tsx:232"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ecc4b1b3e2c82bfe", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/packages/packages-table.tsx:798", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/packages/packages-table.tsx:798"}, "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-80edc7c538da6877", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/suppliers/supplier-combobox.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/suppliers/supplier-combobox.tsx:169"}, "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-b5bed914539af1f8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/activities/activity-comments-panel.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/activities/activity-comments-panel.tsx:77"}, "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-157b334afaaa31ef", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/notes/NoteCard.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/notes/NoteCard.tsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b5742c41e0efbea", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/contacts/ConsumerInsights.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/contacts/ConsumerInsights.tsx:197"}, "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-cdadf0fee9cc2b4b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/email-composer/recipient-token-input.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/email-composer/recipient-token-input.tsx:209"}, "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-fccfcdfba4770a1a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/email-composer/attachment-bar.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/email-composer/attachment-bar.tsx:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bbc530c4f19ddf89", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/email-composer/template-picker.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/email-composer/template-picker.tsx:111"}, "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-bd161ecc386e7745", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/components/email-composer/template-picker.tsx:128", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/components/email-composer/template-picker.tsx:128"}, "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-b74c9a116d82fd44", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/components/email-composer/signature-preview.tsx:18", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/components/email-composer/signature-preview.tsx:18"}, "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-c5a352b276544eeb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/calendar/calendar-navbar-popover.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/calendar/calendar-navbar-popover.tsx:72"}, "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-e3c19ba551402ecd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/pricing/pricing-section.tsx:780", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/pricing/pricing-section.tsx:780"}, "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-659968653f602699", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/settings/email/page.tsx:142", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/settings/email/page.tsx:142"}, "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-7f111e71bdcfbba2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/settings/agency/page.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/settings/agency/page.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-ecddf1ff46e46c1d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/settings/cruise-sync/_components/sync-history-ta", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/settings/cruise-sync/_components/sync-history-table.tsx:142"}, "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-1bb2631684a8bef5", "name": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/library/payment-schedules/page.tsx:138", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/library/payment-schedules/page.tsx:138"}, "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-492489c865a32317", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/tours/_components/tour-detail-modal.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/tours/_components/tour-detail-modal.tsx:653"}, "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-b844b956bac5eab7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/cruises/_components/cruise-card.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/cruises/_components/cruise-card.tsx:104"}, "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-8bae4f788f783eb7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/cruises/_components/cruise-filters.tsx:4", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/cruises/_components/cruise-filters.tsx:449"}, "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-8982a18c8923a385", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/cruises/_components/cruise-detail-modal.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/cruises/_components/cruise-detail-modal.tsx:410"}, "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-6300dcda4aa033c7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/vacation/_components/vacation-detail-mod", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/vacation/_components/vacation-detail-modal.tsx:271"}, "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-4b3eec2dc91b8ef0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/vacation/_components/vacation-hotel-card", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/vacation/_components/vacation-hotel-card.tsx:118"}, "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-ab3cd3e493d6213e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/groups/[groupId]/page.tsx:483", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/groups/[groupId]/page.tsx:483"}, "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-6503685f0e46803e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/groups/[groupId]/_components/add-trip-to-g", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/groups/[groupId]/_components/add-trip-to-group-dialog.tsx:244"}, "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-57a3d1c56a1259e8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/import/_components/contact-combobox.tsx:12", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/import/_components/contact-combobox.tsx:124"}, "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-994374690bc85ef7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/import/_components/import-source-form.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/import/_components/import-source-form.tsx:293"}, "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-5d2f6cb5a5081dd7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-comments.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-comments.tsx:65"}, "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-293a1273a29eee67", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/traveler-accordion-item.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/traveler-accordion-item.tsx:377"}, "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-3d1f9f9ddcbea56d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/cruise-passengers-section", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/cruise-passengers-section.tsx:70"}, "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-38f3c9cc858bd75c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/contact-search-result.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/contact-search-result.tsx:100"}, "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-c7520c6b02e00f66", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-summary-column.tsx:2", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-summary-column.tsx:217"}, "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-754171ce8d17315f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-overview.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-overview.tsx:214"}, "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-01466f693cdeea8e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/automation-job-card.tsx:2", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/automation-job-card.tsx:202"}, "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-7081b9b102230156", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/day-column.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/day-column.tsx:226"}, "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-20bdc8ae23c9227e", "name": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/trips/[id]/_components/lodging-form.tsx:93", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/trips/[id]/_components/lodging-form.tsx:93"}, "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-4491df1003f15b3d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-travelers.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-travelers.tsx:146"}, "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-5e51e4bc0392b353", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-media-tab.tsx:381", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-media-tab.tsx:381"}, "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-6ce2042edd76a9c5", "name": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/trips/[id]/_components/flight-form.tsx:197", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/trips/[id]/_components/flight-form.tsx:197"}, "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-fc6def22abbb163a", "name": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/trips/[id]/_components/dining-form.tsx:60", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/trips/[id]/_components/dining-form.tsx:60"}, "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-13fabc127d41580d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/payment-schedule-section.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/payment-schedule-section.tsx:137"}, "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-953672c0600489b2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/ocr-import/_components/ocr-upload-form.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/ocr-import/_components/ocr-upload-form.tsx:142"}, "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-13835a067debe2f1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/reporting/_components/report-view.tsx:255", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/reporting/_components/report-view.tsx:255"}, "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-911a6d6cbacd2244", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/trip-card.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/trip-card.tsx:38"}, "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-cbcf8085c031fac9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/tasks-due-widget.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/tasks-due-widget.tsx:52"}, "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-8f600a084e9243bb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/payments-due-widget.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/payments-due-widget.tsx:46"}, "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-6d07742a29dd4446", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/sidebar-recent-emails.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/sidebar-recent-emails.tsx:130"}, "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-8f4749c3d7f837f9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/sidebar-agent-leaderboard.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/sidebar-agent-leaderboard.tsx:48"}, "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-9f6dee25444951a0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/emails/inbox/page.tsx:380", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/emails/inbox/page.tsx:380"}, "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-804a93f9feef6396", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/emails/inbox/_components/folder-sidebar.tsx:410", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/emails/inbox/_components/folder-sidebar.tsx:410"}, "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-f379d91775a17512", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/emails/inbox/_components/email-reader.tsx:353", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/emails/inbox/_components/email-reader.tsx:353"}, "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-50f5c10ad6efdd92", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/emails/inbox/_components/email-reader.tsx:319", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/emails/inbox/_components/email-reader.tsx:319"}, "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-186ff6639848618e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/page.tsx:1679", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/page.tsx:1679"}, "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-11a12bc72bd7a892", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/contact-emails-section", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/contact-emails-section.tsx:293"}, "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-e6dba51be70b5304", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/relationships-card.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/relationships-card.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-f024a5384b921a4c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/recent-emails-card.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/recent-emails-card.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-bb6ce429ee7d1e14", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/contacts/[id]/_components/email-preview-dialog.", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/contacts/[id]/_components/email-preview-dialog.tsx:124"}, "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-cd492a497d5bc778", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/relationships-section.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/relationships-section.tsx:138"}, "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-d1d3acd9d966f518", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/loyalty-programs-secti", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/loyalty-programs-section.tsx:119"}, "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-66b8a8246c89354e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/merge-editor-dialog.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/merge-editor-dialog.tsx:224"}, "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-f0dfbe1b9a47ed30", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/contacts-table.tsx:320", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/contacts-table.tsx:320"}, "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-6d35f9dfec17107b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/contact-kanban-card.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/contact-kanban-card.tsx:52"}, "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-44dad624ed3c881a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/contact-import-wizard.tsx:3", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/contact-import-wizard.tsx:331"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9392cb51e3acbc2c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/tag-assign-popover.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/tag-assign-popover.tsx:178"}, "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-ee4289d2b6f65f7f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/duplicates/_components/duplicate-group-", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/duplicates/_components/duplicate-group-card.tsx:59"}, "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-498762e02426241e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/profile/_components/email-setup-wizard.tsx:332", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/profile/_components/email-setup-wizard.tsx:332"}, "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-93f5e4b04e7f285d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/profile/_components/email-tab.tsx:454", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/profile/_components/email-tab.tsx:454"}, "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-b3bc2f6b6e4827d8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/trips/[tripId]/page.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/trips/[tripId]/page.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-ae52e208cbc92df0", "name": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/commission/disbursements/[id]/_components/account-details-dialog", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/commission/disbursements/[id]/_components/account-details-dialog.tsx:12"}, "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-43562f5b55aa7931", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/disbursements/d/[id]/page.tsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/disbursements/d/[id]/page.tsx:283"}, "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-b2c212d04d5f390e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/deposit-builder.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/deposit-builder.tsx:294"}, "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-06f6604882d79cb8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/pending-receivabl", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/pending-receivables-table.tsx:350"}, "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-84aa900642d6bb8d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/adjustment-dialog", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/adjustment-dialog.tsx:103"}, "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-65fcc9e91eee0701", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/match-item-dialog", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/match-item-dialog.tsx:158"}, "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-fd950cc44bbcd924", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/_components/agent-adjustments-dialog.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/_components/agent-adjustments-dialog.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5190eac57c2a14c8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/_components/claim-builder.tsx:374", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/_components/claim-builder.tsx:374"}, "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-1c7085ff5b73c48a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/calendar/_components/calendar-month-view.tsx:295", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/calendar/_components/calendar-month-view.tsx:295"}, "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-2f3d6df77b79b610", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/hooks/use-mfa.ts:214", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/hooks/use-mfa.ts:214"}, "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-b685ffb815461ab6", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/context/loading-context.tsx:276", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/context/loading-context.tsx:276"}, "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-e4153524e5c678a8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/ai/ai-contextual-prompt.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/ai/ai-contextual-prompt.tsx:47"}, "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-befa75b38a554310", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/hub/sections/destinations-section.tsx:25", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/hub/sections/destinations-section.tsx:25"}, "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-393e8c8e6714ad8f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/hub/sections/nearby-section.tsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/hub/sections/nearby-section.tsx:42"}, "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-a446d246c0ac1e85", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/flights/flight-filters.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/flights/flight-filters.tsx:196"}, "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-635e8b0c83641b2f", "name": "TODO/FIXME marker in shipping code \u2014 apps/ota/src/components/flights/flight-search-client.tsx:256", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/ota/src/components/flights/flight-search-client.tsx:256"}, "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-bb36af24ba16b1f5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/search/airport-autocomplete.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/search/airport-autocomplete.tsx:140"}, "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-8525047c8bf360b3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cruise-lines/cruise-line-card.tsx:20", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cruise-lines/cruise-line-card.tsx:20"}, "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-768fac1803d3ae3f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/activity-product-card.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/activity-product-card.tsx:93"}, "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-61d69c6eb623b59e", "name": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/activity-product-card.ts", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/activity-product-card.tsx:34"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1fbdba3aaab6f31e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/hotel-product-card.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/hotel-product-card.tsx:109"}, "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-2facd8385a752c6a", "name": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/hotel-product-card.tsx:4", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/hotel-product-card.tsx:40"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3daef88d2476ca97", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/promotion-card.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/promotion-card.tsx:106"}, "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-a1d7cf1dc887e1c1", "name": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/promotion-card.tsx:36", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/promotion-card.tsx:36"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac5582a9b5765501", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/cruise-product-card.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/cruise-product-card.tsx:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-93dc54b89c04d8ac", "name": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/cruise-product-card.tsx:", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/cruise-product-card.tsx:35"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f12a0aad86c701e0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/flight-product-card.tsx:282", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/flight-product-card.tsx:282"}, "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-9eb6ca6d7530e314", "name": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/flight-product-card.tsx:", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/flight-product-card.tsx:96"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-442a0400f9ccaec7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/tour-product-card.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/tour-product-card.tsx:101"}, "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-377aedc79979fb1c", "name": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/tour-product-card.tsx:37", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/tour-product-card.tsx:37"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-250e87fd4146a75f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/ships/ship-card.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/ships/ship-card.tsx:38"}, "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-327a1757c94f1552", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/trip-builder/trip-picker-dropdown.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/trip-builder/trip-picker-dropdown.tsx:52"}, "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-e4c310fe1f0323ce", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/trip-builder/ai-suggestion-card.tsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/trip-builder/ai-suggestion-card.tsx:37"}, "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-1678bee5ccef85f8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/deals/deal-quick-facts.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/deals/deal-quick-facts.tsx:88"}, "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-8ab832a3f2bd4993", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/advisor/advisor-context-bar.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/advisor/advisor-context-bar.tsx:49"}, "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-e1daa3f8ce7c474d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/ota/src/app/layout.tsx:68", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/ota/src/app/layout.tsx:68"}, "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-a5a155605592e712", "name": "Stray `console.log` in TS/JS \u2014 apps/ota/src/app/api/chat/route.ts:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/ota/src/app/api/chat/route.ts:130"}, "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-d7aa3459eeeaff83", "name": "Stray `console.log` in TS/JS \u2014 scripts/resolve-destination-airports.ts:75", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/resolve-destination-airports.ts:75"}, "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-1829b2e8e4083a50", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/fix-851-unarchive-planning-itineraries.ts:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/fix-851-unarchive-planning-itineraries.ts:61"}, "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-2a8e8f72badbf9f0", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-group-subtrip-payments.ts:230", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-group-subtrip-payments.ts:230"}, "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-ab4c02c931fc8acf", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/import-group-bookings.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/import-group-bookings.ts:79"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23cef2fef365d1fd", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/heal-issue844-insurance-premium.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/heal-issue844-insurance-premium.ts:67"}, "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-cc1794b4b45a508a", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/verify-historical-payout-disjoint.ts:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/verify-historical-payout-disjoint.ts:124"}, "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-9c2392ce0cd1bbbc", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/validate-import.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/validate-import.ts:71"}, "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-99671fded7cc5437", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/precut3-exposure-report.ts:147", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/precut3-exposure-report.ts:147"}, "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-802f0f1e034a4a5b", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-issue915-default-schedule.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-issue915-default-schedule.ts:59"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b0096202340afdf", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/ingest-payroll-csv.ts:253", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/ingest-payroll-csv.ts:253"}, "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-724bfe4df8dd0a57", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/audit-issue915-missing-schedule.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/audit-issue915-missing-schedule.ts:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f5e98afe38f19de", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/extract-travelesolutions.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/extract-travelesolutions.ts:30"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb7618627919224e", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/supplier-dedup.ts:423", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/supplier-dedup.ts:423"}, "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-56bf7dca7b0652ef", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/resync-commission-tracking-372e41a5.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/resync-commission-tracking-372e41a5.ts:64"}, "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-68fc63021196e310", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/verify-commission-mapping.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/verify-commission-mapping.ts:74"}, "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-6dd413392fda5042", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/resync-commission-tracking-clean.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/resync-commission-tracking-clean.ts:88"}, "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-f10993ec21877651", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/ingest-ic-historical-invoices.ts:152", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/ingest-ic-historical-invoices.ts:152"}, "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-f4e87e49ba39dcac", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/import-to-tailfire.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/import-to-tailfire.ts:70"}, "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-c0f32047f2abfbb2", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-issue834-payments.ts:340", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-issue834-payments.ts:340"}, "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-01c21f3a9c049cf4", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/provision-ic-onboarding.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/provision-ic-onboarding.ts:58"}, "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-f81ea1b504af8ee8", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/unwind-historical-ic-ingest.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/unwind-historical-ic-ingest.ts:60"}, "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-2ae80739573125c5", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-flight-legs.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-flight-legs.ts:77"}, "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-7d63a645f1bf2620", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/purge-collaborator.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/purge-collaborator.ts:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e77ca5925bd2a6e6", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-group-subtrip-travelers.ts:138", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-group-subtrip-travelers.ts:138"}, "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-edd8c36560ddb49d", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/provision-advisors-from-csv.ts:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/provision-advisors-from-csv.ts:82"}, "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-893174671892384c", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/waive-historical-platform-fees.ts:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/waive-historical-platform-fees.ts:95"}, "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-bfc019b8a579b4c4", "name": "Stray `console.log` in TS/JS \u2014 scripts/migration/precut-5-provision-prod-agents.ts:170", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/precut-5-provision-prod-agents.ts:170"}, "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-36c72e57fbb8f917", "name": "Stray `console.log` in TS/JS \u2014 scripts/analysis/phase5-ic-payout-worklist.ts:185", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analysis/phase5-ic-payout-worklist.ts:185"}, "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-3c1a61eae93c64ab", "name": "Stray `console.log` in TS/JS \u2014 scripts/e2e/flight-scenarios-e2e.ts:326", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/e2e/flight-scenarios-e2e.ts:326"}, "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-012da430a0a70a8d", "name": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/profile.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/profile.ts:18"}, "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-51ce733d9a3cab62", "name": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/inquiries.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/inquiries.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0226477c3c4d6fb4", "name": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/client.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/client.ts:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ff665a7f54be23a", "name": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/tracking.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/tracking.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a85eb1f5c7d54466", "name": "Stray `console.log` in TS/JS \u2014 packages/database/scripts/replay-from-blank.ts:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/scripts/replay-from-blank.ts:153"}, "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-09fdecd76784c780", "name": "Stray `console.log` in TS/JS \u2014 packages/database/scripts/validate-migrations.ts:154", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/scripts/validate-migrations.ts:154"}, "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-cedb6353dce37c68", "name": "Stray `console.log` in TS/JS \u2014 packages/database/src/seed.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/src/seed.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-db2f89f18f9324cf", "name": "Stray `console.log` in TS/JS \u2014 packages/database/src/reset.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/src/reset.ts:24"}, "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-9d9c73ccc8fa8a89", "name": "Stray `console.log` in TS/JS \u2014 packages/database/src/migrate.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/src/migrate.ts:62"}, "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-568011b3bb7ae88a", "name": "Stray `console.log` in TS/JS \u2014 packages/database/src/seeds/cruise-data-seed.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/src/seeds/cruise-data-seed.ts:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-98cd683917eecf8d", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/trip-proposal-ui/src/components/ActivityCard.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/trip-proposal-ui/src/components/ActivityCard.tsx:67"}, "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-72bcea45c3934d1b", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/trip-proposal-ui/src/components/SideBySideComparison.tsx:6", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/trip-proposal-ui/src/components/SideBySideComparison.tsx:69"}, "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-1bf0da1580488a22", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/trip-proposal-ui/src/components/details/FlightDetail.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/trip-proposal-ui/src/components/details/FlightDetail.tsx:187"}, "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-d81db2210f49f27a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/ui-public/src/components/ui/chart.tsx:72", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/ui-public/src/components/ui/chart.tsx:72"}, "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-eaa0555c642c40e0", "name": "Privileged port 2 in use", "shortDescription": {"text": "Privileged port 2 in use"}, "fullDescription": {"text": "Port 2 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-34ecf40daf02a675", "name": "Privileged port 54 in use", "shortDescription": {"text": "Privileged port 54 in use"}, "fullDescription": {"text": "Port 54 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef22e2cd62db15ae", "name": "Privileged port 55 in use", "shortDescription": {"text": "Privileged port 55 in use"}, "fullDescription": {"text": "Port 55 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a35c6a00f751880f", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eafa8856b311c118", "name": "Possible secret in apps/api/src/activity-logs/audit-sanitizer.spec.ts", "shortDescription": {"text": "Possible secret in apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e7162e00bbc25975", "name": "Insecure pattern 'weak_hash' in apps/api/src/cruise-import/README.md:11", "shortDescription": {"text": "Insecure pattern 'weak_hash' in apps/api/src/cruise-import/README.md:11"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc545ed272cc08a9", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/playwright-report/index.html:58", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/playwright-report/index.html:58"}, "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-feb1e9807561b119", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/playwright-report/index.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/playwright-report/index.html:57"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d664528e85129136", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/components/email-composer/signature-preview.tsx:18", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/components/email-composer/signature-preview.tsx:18"}, "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-21515ba914a12b3a", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/settings/email/page.tsx:142", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/settings/email/page.tsx:142"}, "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-e87471a5d4df4b77", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/auth/callback/route.ts:203", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/auth/callback/route.ts:203"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f471cd0dd4e0ac44", "name": "Insecure pattern 'domparser_html_parse' in apps/admin/src/app/trips/[id]/_components/tour-form.tsx:549", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in apps/admin/src/app/trips/[id]/_components/tour-form.tsx:549"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c5176c237c10e04e", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/emails/inbox/_components/email-reader.tsx:319", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/emails/inbox/_components/email-reader.tsx:319"}, "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-ea2dc28afd9264ee", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/contacts/[id]/_components/email-preview-dialog.tsx:124", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/contacts/[id]/_components/email-preview-dialog.tsx:124"}, "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-5c429b43ad1e7a77", "name": "Insecure pattern 'document_write' in apps/admin/src/app/contacts/_components/contact-print-report.ts:73", "shortDescription": {"text": "Insecure pattern 'document_write' in apps/admin/src/app/contacts/_components/contact-print-report.ts:73"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8474c287680343d1", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/profile/_components/email-setup-wizard.tsx:332", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/profile/_components/email-setup-wizard.tsx:332"}, "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-7908a077f22039e7", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/profile/_components/email-tab.tsx:454", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/profile/_components/email-tab.tsx:454"}, "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-2993ecac31965cbe", "name": "Insecure pattern 'domparser_html_parse' in apps/admin/src/lib/sanitize-email-html.ts:36", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in apps/admin/src/lib/sanitize-email-html.ts:36"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c0390de2e5fa72c", "name": "Insecure pattern 'local_storage_auth_token' in apps/ota/src/stores/travel-session-store.ts:21", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in apps/ota/src/stores/travel-session-store.ts:21"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-54029cd62e014fa2", "name": "Insecure pattern 'dangerous_innerhtml' in apps/ota/src/app/layout.tsx:68", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/ota/src/app/layout.tsx:68"}, "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-fb5ccdb05f5adba4", "name": "Possible secret in scripts/setup-local-fdw.sh", "shortDescription": {"text": "Possible secret in scripts/setup-local-fdw.sh"}, "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-8fdc5b383c694c86", "name": "Insecure pattern 'node_child_process' in scripts/run-next.mjs:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/run-next.mjs:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b96a535ae23413f", "name": "Insecure pattern 'exec_used' in scripts/demo/lib/backup.ts:13", "shortDescription": {"text": "Insecure pattern 'exec_used' in scripts/demo/lib/backup.ts:13"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-885e43eb49456373", "name": "Insecure pattern 'node_child_process' in scripts/demo/lib/backup.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/demo/lib/backup.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed49e4ca4e9c912e", "name": "Insecure pattern 'node_child_process' in scripts/migration/verify-commission-mapping.ts:25", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/migration/verify-commission-mapping.ts:25"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0ec1378721f158f6", "name": "Possible secret in scripts/migration/tes-import-runner.sh", "shortDescription": {"text": "Possible secret in scripts/migration/tes-import-runner.sh"}, "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-7399a058f49f3bf3", "name": "Insecure pattern 'dangerous_innerhtml' in packages/ui-public/src/components/ui/chart.tsx:72", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/ui-public/src/components/ui/chart.tsx:72"}, "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-645e19ad7523a311", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "dopplerhq/secrets-fetch-action@v1.3.1 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-36fd3c86ff87e5ff", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "dopplerhq/secrets-fetch-action@v1.3.1 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d7b03e0a59e2187", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "pnpm/action-setup@v2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fc9b546ea9419ede", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "dopplerhq/secrets-fetch-action@v1.3.1 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-548309a3a5a17d98", "name": "Very large file: apps/api/src/financials/trip-order.service.ts (2086 lines)", "shortDescription": {"text": "Very large file: apps/api/src/financials/trip-order.service.ts (2086 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-49e9c35e64028639", "name": "Very large file: apps/api/src/financials/commission/commission.service.ts (4263 lines)", "shortDescription": {"text": "Very large file: apps/api/src/financials/commission/commission.service.ts (4263 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-ebe9015e4581bb09", "name": "Very large file: apps/api/src/financials/commission/commission-reports.service.ts (1668 lines)", "shortDescription": {"text": "Very large file: apps/api/src/financials/commission/commission-reports.service.ts (1668 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-f529ec698f163470", "name": "Very large file: apps/api/src/trips/activities.service.ts (3558 lines)", "shortDescription": {"text": "Very large file: apps/api/src/trips/activities.service.ts (3558 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-252ace1ce6f18d03", "name": "Very large file: apps/api/src/trips/payment-schedules.service.ts (2977 lines)", "shortDescription": {"text": "Very large file: apps/api/src/trips/payment-schedules.service.ts (2977 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-5291e344f45dd206", "name": "Very large file: apps/api/src/trips/component-orchestration.service.ts (4265 lines)", "shortDescription": {"text": "Very large file: apps/api/src/trips/component-orchestration.service.ts (4265 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-c7ea8cd703b43940", "name": "Very large file: apps/api/src/trips/trips.service.ts (7616 lines)", "shortDescription": {"text": "Very large file: apps/api/src/trips/trips.service.ts (7616 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-f1dab515e7d91f1e", "name": "Very large file: apps/api/src/ic-payouts/backfill/ic-backfill.service.ts (1092 lines)", "shortDescription": {"text": "Very large file: apps/api/src/ic-payouts/backfill/ic-backfill.service.ts (1092 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-3c3d1e9dfb26c71d", "name": "Very large file: apps/api/src/ic-payouts/invoices/ic-invoice.service.ts (1527 lines)", "shortDescription": {"text": "Very large file: apps/api/src/ic-payouts/invoices/ic-invoice.service.ts (1527 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-1af1bc5b021e085c", "name": "Very large file: apps/api/src/ic-payouts/invoices/__tests__/ic-invoice.service.spec.ts (1446 lines)", "shortDescription": {"text": "Very large file: apps/api/src/ic-payouts/invoices/__tests__/ic-invoice.service.spec.ts (1446 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-6123837a71620c20", "name": "Very large file: apps/api/src/cruise-booking/services/import-booking.service.ts (2375 lines)", "shortDescription": {"text": "Very large file: apps/api/src/cruise-booking/services/import-booking.service.ts (2375 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-66434f29b11eb512", "name": "Very large file: apps/api/src/cruise-repository/cruise-repository.service.ts (1588 lines)", "shortDescription": {"text": "Very large file: apps/api/src/cruise-repository/cruise-repository.service.ts (1588 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-3f07e182e3b5132d", "name": "Very large file: apps/api/src/ocr-import/ocr-import.service.ts (2766 lines)", "shortDescription": {"text": "Very large file: apps/api/src/ocr-import/ocr-import.service.ts (2766 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-4bb9c9313612e0d8", "name": "Very large file: apps/api/src/cruise-import/services/sailing-import.service.ts (1484 lines)", "shortDescription": {"text": "Very large file: apps/api/src/cruise-import/services/sailing-import.service.ts (1484 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-47af71bc07405c76", "name": "Very large file: apps/admin/src/components/packages/packages-table.tsx (1759 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/components/packages/packages-table.tsx (1759 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-daf8ff7a43e2124f", "name": "Very large file: apps/admin/src/app/trips/[id]/_components/options-form.tsx (1251 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/options-form.tsx (1251 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-cbd1d440a631b544", "name": "Very large file: apps/admin/src/app/trips/[id]/_components/custom-cruise-form.tsx (2239 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/custom-cruise-form.tsx (2239 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-da2a0b82fa2ef68e", "name": "Very large file: apps/admin/src/app/trips/[id]/_components/tour-form.tsx (1465 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/tour-form.tsx (1465 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-5511246730cda656", "name": "Very large file: apps/admin/src/app/trips/[id]/_components/lodging-form.tsx (1454 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/lodging-form.tsx (1454 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-e551fc4a30d1f651", "name": "Very large file: apps/admin/src/app/trips/[id]/_components/transportation-form.tsx (2209 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/transportation-form.tsx (2209 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-47c298579a7ab310", "name": "Very large file: apps/admin/src/app/trips/[id]/_components/flight-form.tsx (2117 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/flight-form.tsx (2117 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-2f8b4375ad4409c9", "name": "Very large file: apps/admin/src/app/contacts/[id]/page.tsx (1987 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/contacts/[id]/page.tsx (1987 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-4db9276592065c1a", "name": "Very large file: scripts/migration/import-to-tailfire.ts (3614 lines)", "shortDescription": {"text": "Very large file: scripts/migration/import-to-tailfire.ts (3614 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "114 test file(s) for 2295 source file(s) (ratio 0.05). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b8f493dac51a65f", "name": "Node manifest has dependencies but no lockfile: apps/client/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/client/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5c30f715681a4005", "name": "Node manifest has dependencies but no lockfile: apps/admin/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/admin/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ae24c2e9d6105b9", "name": "Node manifest has dependencies but no lockfile: apps/ota/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/ota/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eddecaa766cadff2", "name": "Node manifest has dependencies but no lockfile: packages/config/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/config/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-526a53ac2db6e202", "name": "Node manifest has dependencies but no lockfile: packages/shared-types/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared-types/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb01c01804de0b47", "name": "Node manifest has dependencies but no lockfile: packages/database/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/database/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8e9a6bad34f0d301", "name": "Node manifest has dependencies but no lockfile: packages/trip-proposal-ui/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/trip-proposal-ui/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b7ecfb08533e7d1f", "name": "Node manifest has dependencies but no lockfile: packages/ui-public/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/ui-public/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 671 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 1054 placeholder/mock markers across 268 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c05e8b612674499a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/client/src/lib/api.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/client/src/lib/api.ts:56"}, "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-6c8962ee90def9f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/client/src/hooks/use-client-profile.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/client/src/hooks/use-client-profile.ts:54"}, "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-dde524fd5b32e6c1", "name": "Commented-code block (5 lines) in apps/api/src/main.ts:77", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/main.ts:77"}, "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-e97a7f338abed5a5", "name": "Commented-code block (7 lines) in apps/api/src/automation/automation.service.ts:129", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/automation/automation.service.ts:129"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-800b80429c438fc3", "name": "Commented-code block (5 lines) in apps/api/src/automation/listeners/trip-lifecycle.listener.ts:39", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/automation/listeners/trip-lifecycle.listener.ts:39"}, "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-9e7fdfe24a657b41", "name": "Commented-code block (6 lines) in apps/api/src/automation/processors/client-care.processor.ts:1025", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/automation/processors/client-care.processor.ts:1025"}, "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-257fe0b0d424555b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/unsplash/unsplash.service.ts:203", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/unsplash/unsplash.service.ts:203"}, "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-a939b1d6c546c1b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/financials/exchange-rates.service.ts:314", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/financials/exchange-rates.service.ts:314"}, "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-74e14d99c4d5ec65", "name": "Commented-code block (6 lines) in apps/api/src/financials/trip-order.controller.ts:296", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/financials/trip-order.controller.ts:296"}, "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-c8d1302081455d30", "name": "Commented-code block (5 lines) in apps/api/src/financials/financial-summary.service.ts:129", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/financials/financial-summary.service.ts:129"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3fb72373e1708c8e", "name": "Commented-code block (7 lines) in apps/api/src/financials/trip-order.service.ts:178", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/financials/trip-order.service.ts:178"}, "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-6ed017e8169d0003", "name": "Commented-code block (7 lines) in apps/api/src/financials/commission/commission-settlement-reversal.service.ts:128", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/financials/commission/commission-settlement-reversal.service.ts:128"}, "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-44f0d45ebee57201", "name": "Commented-code block (6 lines) in apps/api/src/financials/commission/commission-drift.service.ts:159", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/financials/commission/commission-drift.service.ts:159"}, "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-b4335351074cfc91", "name": "Commented-code block (6 lines) in apps/api/src/financials/commission/recall-clawback.service.ts:103", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/financials/commission/recall-clawback.service.ts:103"}, "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-f6e7f42e4be18904", "name": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-formula.ts:143", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-formula.ts:143"}, "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-394039b0cdc46cda", "name": "Commented-code block (7 lines) in apps/api/src/financials/commission/commission.service.ts:505", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/financials/commission/commission.service.ts:505"}, "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-44620484be09e8fb", "name": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-reconcile.service.ts:467", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-reconcile.service.ts:467"}, "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-b195fe4a88990864", "name": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-drift.service.spec.ts:491", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-drift.service.spec.ts:491"}, "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-aec85d4765cdb960", "name": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-settlement-reversal.service.spec.ts:129", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-settlement-reversal.service.spec.ts:129"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69e408f4e4f7e7c5", "name": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-reports.service.ts:345", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-reports.service.ts:345"}, "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-b0a9e9534eb3197b", "name": "Commented-code block (5 lines) in apps/api/src/email-accounts/email-accounts.service.ts:657", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/email-accounts/email-accounts.service.ts:657"}, "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-dfb699f0effe0841", "name": "Commented-code block (5 lines) in apps/api/src/email-accounts/smtp-send.service.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/email-accounts/smtp-send.service.ts:30"}, "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-c00e1903ce5a7b02", "name": "Legacy-named symbol `deleteOld` in apps/api/src/notifications/platform-notification.service.ts:311", "shortDescription": {"text": "Legacy-named symbol `deleteOld` in apps/api/src/notifications/platform-notification.service.ts:311"}, "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-eb68561a95505532", "name": "Commented-code block (7 lines) in apps/api/src/notifications/listeners/notification-events.listener.ts:525", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/notifications/listeners/notification-events.listener.ts:525"}, "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-7d20bb6e9a601513", "name": "Commented-code block (5 lines) in apps/api/src/email/email.service.ts:172", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/email/email.service.ts:172"}, "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-e29a44dc510f22b5", "name": "Commented-code block (5 lines) in apps/api/src/trips/trips.module.ts:223", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/trips/trips.module.ts:223"}, "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-5cc404b8f46e5fb3", "name": "Commented-code block (6 lines) in apps/api/src/trips/trip-access.service.ts:140", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/trips/trip-access.service.ts:140"}, "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-136aefede0d07d4d", "name": "Legacy-named symbol `supplierLegacy` in apps/api/src/trips/activities.service.ts:2720", "shortDescription": {"text": "Legacy-named symbol `supplierLegacy` in apps/api/src/trips/activities.service.ts:2720"}, "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-4ad80bbf7044b949", "name": "Commented-code block (7 lines) in apps/api/src/trips/activities.service.ts:163", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/trips/activities.service.ts:163"}, "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-c0b3d9466c27909b", "name": "Commented-code block (5 lines) in apps/api/src/trips/trip-access.service.spec.ts:480", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/trips/trip-access.service.spec.ts:480"}, "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-79fd8635486e2774", "name": "Commented-code block (5 lines) in apps/api/src/trips/itinerary-days.service.ts:123", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/trips/itinerary-days.service.ts:123"}, "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-7c43016b3e6e2619", "name": "Commented-code block (8 lines) in apps/api/src/trips/payment-schedules.service.ts:324", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/trips/payment-schedules.service.ts:324"}, "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-819cd3b2128d7c7b", "name": "Commented-code block (9 lines) in apps/api/src/trips/insurance.service.ts:352", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/trips/insurance.service.ts:352"}, "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-80c6c1926efe3b2f", "name": "Commented-code block (9 lines) in apps/api/src/trips/activity-media.controller.ts:137", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/trips/activity-media.controller.ts:137"}, "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-84ec1afb15f40633", "name": "Commented-code block (9 lines) in apps/api/src/trips/merge-itineraries.service.ts:166", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/trips/merge-itineraries.service.ts:166"}, "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-3787963e1b0d6374", "name": "Commented-code block (8 lines) in apps/api/src/trips/flight-segments.service.ts:201", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/trips/flight-segments.service.ts:201"}, "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-53de014595776011", "name": "Commented-code block (8 lines) in apps/api/src/trips/component-orchestration.service.ts:468", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/trips/component-orchestration.service.ts:468"}, "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-ff8bcda702deed3f", "name": "Commented-code block (12 lines) in apps/api/src/trips/trip-travelers.service.ts:123", "shortDescription": {"text": "Commented-code block (12 lines) in apps/api/src/trips/trip-travelers.service.ts:123"}, "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-6d7a934d754c8f0e", "name": "Commented-code block (5 lines) in apps/api/src/trips/trips.service.ts:2049", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/trips/trips.service.ts:2049"}, "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-bb17aaf7fa88f9c8", "name": "Commented-code block (7 lines) in apps/api/src/trips/activities.controller.ts:141", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/trips/activities.controller.ts:141"}, "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-f3e9cae8f09e25d3", "name": "Commented-code block (5 lines) in apps/api/src/trips/activity-bookings.service.ts:74", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/trips/activity-bookings.service.ts:74"}, "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-367150239b9ec241", "name": "Commented-code block (5 lines) in apps/api/src/trips/__tests__/proposal-archived-itinerary-exclusion.integration.spec.ts", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/trips/__tests__/proposal-archived-itinerary-exclusion.integration.spec.ts:110"}, "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-d1b00dec2848b770", "name": "Commented-code block (5 lines) in apps/api/src/trips/__tests__/legacy-routes-deprecation.spec.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/trips/__tests__/legacy-routes-deprecation.spec.ts:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-657c3d1d1cfcb44b", "name": "Commented-code block (5 lines) in apps/api/src/reporting/queries/compliance.queries.ts:395", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/reporting/queries/compliance.queries.ts:395"}, "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-f35643132cb38acc", "name": "Commented-code block (7 lines) in apps/api/src/reporting/queries/financial.queries.ts:480", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/reporting/queries/financial.queries.ts:480"}, "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-d588a40ccf607a18", "name": "Commented-code block (5 lines) in apps/api/src/ic-payouts/__tests__/disbursement-failure-path.spec.ts:125", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/ic-payouts/__tests__/disbursement-failure-path.spec.ts:125"}, "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-8bf8a4fff81c6d3a", "name": "Commented-code block (5 lines) in apps/api/src/ic-payouts/disbursements/disbursement.service.ts:310", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/ic-payouts/disbursements/disbursement.service.ts:310"}, "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-a0d101e12305cecb", "name": "Commented-code block (6 lines) in apps/api/src/ic-payouts/payout-accounts/ic-payout-accounts.service.ts:87", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/ic-payouts/payout-accounts/ic-payout-accounts.service.ts:87"}, "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-d88c00beb1070857", "name": "Commented-code block (7 lines) in apps/api/src/ic-payouts/backfill/ic-backfill.service.ts:508", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/ic-payouts/backfill/ic-backfill.service.ts:508"}, "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-6c6d7a1d49db16bc", "name": "Commented-code block (9 lines) in apps/api/src/ic-payouts/backfill/dto/backfill-invoice.dto.ts:18", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/ic-payouts/backfill/dto/backfill-invoice.dto.ts:18"}, "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-0fef4a326336aa39", "name": "Commented-code block (6 lines) in apps/api/src/ic-payouts/invoices/ic-invoice.controller.ts:246", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/ic-payouts/invoices/ic-invoice.controller.ts:246"}, "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-421dc7ec3143c60a", "name": "Commented-code block (10 lines) in apps/api/src/ic-payouts/invoices/ic-invoice.service.ts:198", "shortDescription": {"text": "Commented-code block (10 lines) in apps/api/src/ic-payouts/invoices/ic-invoice.service.ts:198"}, "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-42af6312129d20dd", "name": "Commented-code block (5 lines) in apps/api/src/ic-payouts/invoices/__tests__/ic-invoice.service.spec.ts:72", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/ic-payouts/invoices/__tests__/ic-invoice.service.spec.ts:72"}, "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-a2f15802abc8c6fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/ic-payouts/invoices/__tests__/ic-invoice.service.spec.ts:274", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/ic-payouts/invoices/__tests__/ic-invoice.service.spec.ts:274"}, "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-0ba77ac4eaa1fc75", "name": "Commented-code block (6 lines) in apps/api/src/external-apis/providers/amadeus/amadeus-hotels.provider.ts:181", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/external-apis/providers/amadeus/amadeus-hotels.provider.ts:181"}, "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-9f74ea56b1fbe9b8", "name": "Commented-code block (7 lines) in apps/api/src/cruise-booking/services/import-booking.service.ts:457", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/cruise-booking/services/import-booking.service.ts:457"}, "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-136022414a8184c8", "name": "Commented-code block (5 lines) in apps/api/src/document-templates/document-templates.service.ts:947", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/document-templates/document-templates.service.ts:947"}, "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-11990d0e1ab680d6", "name": "Commented-code block (7 lines) in apps/api/src/document-templates/document-templates.controller.ts:70", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/document-templates/document-templates.controller.ts:70"}, "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-a4bf15a421d3b8fa", "name": "Commented-code block (8 lines) in apps/api/src/document-templates/system-templates/trip-order.template.ts:17", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/document-templates/system-templates/trip-order.template.ts:17"}, "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-e2be871941c0a65c", "name": "Commented-code block (5 lines) in apps/api/src/tasks/task-access.service.ts:76", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/tasks/task-access.service.ts:76"}, "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-e2e8fe960e5a3647", "name": "Commented-code block (5 lines) in apps/api/src/consumer-auth/turnstile.service.ts:55", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/consumer-auth/turnstile.service.ts:55"}, "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-10d91c5af0342522", "name": "Commented-code block (9 lines) in apps/api/src/cruise-repository/cruise-repository.service.ts:1123", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/cruise-repository/cruise-repository.service.ts:1123"}, "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-6ab4cfd41b0813e6", "name": "Commented-code block (5 lines) in apps/api/src/suppliers/suppliers.service.ts:114", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/suppliers/suppliers.service.ts:114"}, "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-e606c15badcfcab9", "name": "Commented-code block (6 lines) in apps/api/src/portal/portal.service.ts:841", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/portal/portal.service.ts:841"}, "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-ec22764f070b1d8f", "name": "Commented-code block (5 lines) in apps/api/src/contacts/contacts.service.ts:247", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/contacts/contacts.service.ts:247"}, "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-55e12f5463e2b8c9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/tour-import/tour-import.service.ts:316", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/tour-import/tour-import.service.ts:316"}, "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-cf608ad3636912d0", "name": "Legacy-named symbol `rest_v1` in apps/api/src/destinations/wikipedia.service.ts:35", "shortDescription": {"text": "Legacy-named symbol `rest_v1` in apps/api/src/destinations/wikipedia.service.ts:35"}, "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-8065c1f7cd008a51", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/destinations/wikipedia.service.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/destinations/wikipedia.service.ts:25"}, "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-449db257071e947b", "name": "Commented-code block (5 lines) in apps/api/src/cruise-import/services/import-orchestrator.service.ts:104", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/cruise-import/services/import-orchestrator.service.ts:104"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec95f36be2c88ee9", "name": "Commented-code block (5 lines) in apps/api/src/forms/forms.service.ts:552", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/forms/forms.service.ts:552"}, "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-eb677dbbfc9d8c58", "name": "Commented-code block (5 lines) in apps/api/src/storage/providers/storage-provider.factory.ts:189", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/storage/providers/storage-provider.factory.ts:189"}, "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-b8f25608272d8728", "name": "Legacy-named symbol `hashB_old` in apps/api/src/vacation-import/services/__tests__/change-detector.service.spec.ts:69", "shortDescription": {"text": "Legacy-named symbol `hashB_old` in apps/api/src/vacation-import/services/__tests__/change-detector.service.spec.ts:69"}, "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-78c2f0a787e84343", "name": "Commented-code block (7 lines) in apps/admin/vitest.config.ts:23", "shortDescription": {"text": "Commented-code block (7 lines) in apps/admin/vitest.config.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1abac9976e1467e6", "name": "Commented-code block (6 lines) in apps/admin/src/middleware.ts:116", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/middleware.ts:116"}, "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-0b6dadc7fa7fa446", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/components/media-uploader.tsx:208", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/components/media-uploader.tsx:208"}, "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-19d8e96bbf709a39", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/components/document-uploader.tsx:244", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/components/document-uploader.tsx:244"}, "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-1045c4b66ed72ed0", "name": "Commented-code block (5 lines) in apps/admin/src/components/trips/trips-kanban.tsx:236", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/components/trips/trips-kanban.tsx:236"}, "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-34be81c77ca4cd36", "name": "Commented-code block (5 lines) in apps/admin/src/components/ui/resizable-pane-layout.tsx:52", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/components/ui/resizable-pane-layout.tsx:52"}, "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-97939d6bb022697b", "name": "Commented-code block (5 lines) in apps/admin/src/components/ui/date-picker-enhanced.tsx:133", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/components/ui/date-picker-enhanced.tsx:133"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff467357d4f3514e", "name": "Commented-code block (5 lines) in apps/admin/src/components/activities/booking-header-button.tsx:207", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/components/activities/booking-header-button.tsx:207"}, "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-ef560af3c3356f39", "name": "Commented-code block (6 lines) in apps/admin/src/components/pricing/pricing-section.tsx:161", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/components/pricing/pricing-section.tsx:161"}, "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-5e47fb60d63bd8f5", "name": "Commented-code block (5 lines) in apps/admin/src/components/pricing/commission-section.tsx:84", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/components/pricing/commission-section.tsx:84"}, "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-e783b71d0f843d9b", "name": "Commented-code block (6 lines) in apps/admin/src/providers/auth-provider.tsx:68", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/providers/auth-provider.tsx:68"}, "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-be940ba06078105b", "name": "Commented-code block (5 lines) in apps/admin/src/app/library/layout.tsx:100", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/library/layout.tsx:100"}, "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-8c31ad534d2ea8c6", "name": "Commented-code block (5 lines) in apps/admin/src/app/library/cruises/page.tsx:78", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/library/cruises/page.tsx:78"}, "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-7be0813ff7e26099", "name": "Commented-code block (6 lines) in apps/admin/src/app/library/templates/[id]/edit/_editor-content.tsx:98", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/app/library/templates/[id]/edit/_editor-content.tsx:98"}, "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-3a4d541cdf18cc49", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/auth/reset-password/page.tsx:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/auth/reset-password/page.tsx:119"}, "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-cdf1caa34d98af29", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/auth/mfa-enroll/page.tsx:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/auth/mfa-enroll/page.tsx:68"}, "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-a8d487263bb8d4e7", "name": "Commented-code block (5 lines) in apps/admin/src/app/trips/page.tsx:94", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/page.tsx:94"}, "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-9a5a87e412e08197", "name": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/page.tsx:398", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/page.tsx:398"}, "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-3a950b8a8500c4b4", "name": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/itinerary-table-view.tsx:278", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/itinerary-table-view.tsx:278"}, "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-c162397ed2b3c346", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/trips/[id]/_components/custom-cruise-form.tsx:1581", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/trips/[id]/_components/custom-cruise-form.tsx:1581"}, "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-9c1f6518febac263", "name": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/trip-insurance.tsx:799", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/trip-insurance.tsx:799"}, "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-62f1bdacdb888440", "name": "Commented-code block (6 lines) in apps/admin/src/app/trips/[id]/_components/itinerary-days-list.tsx:46", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/app/trips/[id]/_components/itinerary-days-list.tsx:46"}, "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-cdc48fd3ffc9f595", "name": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/tour-form.tsx:296", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/tour-form.tsx:296"}, "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-59e49ccfd0790739", "name": "Commented-code block (7 lines) in apps/admin/src/app/trips/[id]/_components/trip-itinerary.tsx:68", "shortDescription": {"text": "Commented-code block (7 lines) in apps/admin/src/app/trips/[id]/_components/trip-itinerary.tsx:68"}, "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-5517af0fce4ac98f", "name": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/transportation-form.tsx:397", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/transportation-form.tsx:397"}, "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-77072f1214db87ab", "name": "Commented-code block (6 lines) in apps/admin/src/app/trips/[id]/_components/flight-form.tsx:376", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/app/trips/[id]/_components/flight-form.tsx:376"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0d1942b950c84ae5", "name": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/dining-form.tsx:169", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/dining-form.tsx:169"}, "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-653d9e1b03bf7d31", "name": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/payment-schedule-section.tsx:541", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/payment-schedule-section.tsx:541"}, "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-6198bcd3bac130ee", "name": "Commented-code block (6 lines) in apps/admin/src/app/profile/_components/email-tab.tsx:89", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/app/profile/_components/email-tab.tsx:89"}, "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-98df216d44d676f7", "name": "Commented-code block (6 lines) in apps/admin/src/app/commission/receive/page.tsx:273", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/app/commission/receive/page.tsx:273"}, "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-1fbfc1957855686e", "name": "Commented-code block (5 lines) in apps/admin/src/app/commission/receive/_components/deposit-builder.tsx:141", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/commission/receive/_components/deposit-builder.tsx:141"}, "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-936cf9e47ecba441", "name": "Commented-code block (5 lines) in apps/admin/src/app/commission/receive/_components/pending-receivables-table.tsx:147", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/commission/receive/_components/pending-receivables-table.tsx:147"}, "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-7fb0ef3f04ea778e", "name": "Commented-code block (5 lines) in apps/admin/src/app/commission/receive/_components/match-item-dialog.tsx:47", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/commission/receive/_components/match-item-dialog.tsx:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c3e2e19b26ea2763", "name": "Commented-code block (5 lines) in apps/admin/src/app/calendar/_components/calendar-list-view.tsx:17", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/calendar/_components/calendar-list-view.tsx:17"}, "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-837edabc5850cc06", "name": "Commented-code block (5 lines) in apps/admin/src/app/calendar/_components/calendar-day-view.tsx:39", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/app/calendar/_components/calendar-day-view.tsx:39"}, "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-4207c78add3c7579", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/api.ts:164", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/api.ts:164"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f4f9f53f7593265", "name": "Legacy-named symbol `normalizedOld` in apps/admin/src/lib/snapshot-utils.ts:203", "shortDescription": {"text": "Legacy-named symbol `normalizedOld` in apps/admin/src/lib/snapshot-utils.ts:203"}, "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-f02607486066bcd0", "name": "Commented-code block (6 lines) in apps/admin/src/lib/utils.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/utils.ts:8"}, "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-516af0c882740b9e", "name": "Commented-code block (6 lines) in apps/admin/src/lib/validation/dining-validation.ts:44", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/validation/dining-validation.ts:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-16feac776c1340e5", "name": "Commented-code block (7 lines) in apps/admin/src/lib/validation/flight-validation.ts:18", "shortDescription": {"text": "Commented-code block (7 lines) in apps/admin/src/lib/validation/flight-validation.ts:18"}, "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-e03808d9f2f5e28b", "name": "Commented-code block (8 lines) in apps/admin/src/lib/validation/transportation-validation.ts:413", "shortDescription": {"text": "Commented-code block (8 lines) in apps/admin/src/lib/validation/transportation-validation.ts:413"}, "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-e434d231a8454233", "name": "Commented-code block (6 lines) in apps/admin/src/lib/validation/options-validation.ts:46", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/validation/options-validation.ts:46"}, "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-69d78a966862b535", "name": "Commented-code block (6 lines) in apps/admin/src/lib/validation/cruise-validation.ts:113", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/validation/cruise-validation.ts:113"}, "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-cc71c2cf42b18468", "name": "Commented-code block (6 lines) in apps/admin/src/lib/validation/__tests__/start-end-datetime-rollup.test.ts:213", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/validation/__tests__/start-end-datetime-rollup.test.ts:213"}, "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-545bca28c04e0d5c", "name": "Commented-code block (10 lines) in apps/admin/src/lib/supabase/middleware.ts:46", "shortDescription": {"text": "Commented-code block (10 lines) in apps/admin/src/lib/supabase/middleware.ts:46"}, "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-1a1a5a2bbb4171f1", "name": "Commented-code block (5 lines) in apps/admin/src/lib/dirty-guard/dirty-guard-provider.tsx:125", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/lib/dirty-guard/dirty-guard-provider.tsx:125"}, "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-6e4c7c4f50e4d11e", "name": "Commented-code block (5 lines) in apps/admin/src/lib/calendar/event-priority.spec.ts:15", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/lib/calendar/event-priority.spec.ts:15"}, "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-4357290b7a3bc53c", "name": "Commented-code block (7 lines) in apps/admin/src/lib/pricing/currency-helpers.ts:68", "shortDescription": {"text": "Commented-code block (7 lines) in apps/admin/src/lib/pricing/currency-helpers.ts:68"}, "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-cbbcc8de14c66a9d", "name": "Commented-code block (7 lines) in apps/admin/src/hooks/use-activity-form-lifecycle.ts:232", "shortDescription": {"text": "Commented-code block (7 lines) in apps/admin/src/hooks/use-activity-form-lifecycle.ts:232"}, "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-ccd34eb9f9c81e11", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-reporting.ts:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-reporting.ts:90"}, "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-61932fd9da2f9683", "name": "Commented-code block (5 lines) in apps/admin/src/hooks/use-activity-form-lifecycle.spec.ts:339", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-activity-form-lifecycle.spec.ts:339"}, "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-96d4e39e0dd11efc", "name": "Commented-code block (6 lines) in apps/admin/src/hooks/use-tours.ts:56", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/hooks/use-tours.ts:56"}, "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-c6db7a2d62e71284", "name": "Commented-code block (5 lines) in apps/admin/src/hooks/use-activity-bookings.ts:40", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-activity-bookings.ts:40"}, "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-f69bde9250339474", "name": "Commented-code block (5 lines) in apps/admin/src/hooks/use-payment-schedules.ts:156", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-payment-schedules.ts:156"}, "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-6c79a4227583a2d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-financial-summary.ts:113", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-financial-summary.ts:113"}, "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-d9a84c8b1a84af6e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-mfa.ts:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-mfa.ts:100"}, "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-7e61d13d5da1dc8a", "name": "Commented-code block (5 lines) in apps/admin/src/hooks/use-reconcile.ts:57", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-reconcile.ts:57"}, "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-24d7a65315811d4a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-trip-orders.ts:252", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-trip-orders.ts:252"}, "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-b4c4ed525119dbec", "name": "Commented-code block (6 lines) in apps/admin/src/hooks/use-activity-navigation.ts:83", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/hooks/use-activity-navigation.ts:83"}, "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-eb96341d38ceb0da", "name": "Commented-code block (5 lines) in apps/admin/src/hooks/use-flights.ts:228", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-flights.ts:228"}, "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-2656dec7799cd137", "name": "Commented-code block (5 lines) in apps/admin/src/hooks/use-merge-itineraries.ts:64", "shortDescription": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-merge-itineraries.ts:64"}, "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-da37a0e7cdaaf3af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/hub/sections/client-hotel-results.tsx:130", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/hub/sections/client-hotel-results.tsx:130"}, "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-a2e392d77b37b872", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/hub/sections/client-flight-results.tsx:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/hub/sections/client-flight-results.tsx:147"}, "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-a4662e3c52dda840", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/flights/flight-request-form.tsx:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/flights/flight-request-form.tsx:13"}, "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-1076575010ef97e9", "name": "Commented-code block (11 lines) in apps/ota/src/components/flights/flight-search-client.tsx:256", "shortDescription": {"text": "Commented-code block (11 lines) in apps/ota/src/components/flights/flight-search-client.tsx:256"}, "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-e4e9c07b9509c4e1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/flights/flight-search-client.tsx:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/flights/flight-search-client.tsx:14"}, "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-4b001e167572f479", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/flights/flight-card.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/flights/flight-card.tsx:18"}, "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-6c8838cab18a2bc9", "name": "Commented-code block (5 lines) in apps/ota/src/components/chat/chat-widget.tsx:101", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ota/src/components/chat/chat-widget.tsx:101"}, "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-0a1e205c59eca230", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/chat/chat-widget.tsx:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/chat/chat-widget.tsx:31"}, "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-b5f0069ae9f414c6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/join/register-form.tsx:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/join/register-form.tsx:75"}, "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-61f85821056d3e35", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/destinations/destination-gallery.tsx:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/destinations/destination-gallery.tsx:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e21b40cb09652894", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/trip-builder/trip-basket-store.ts:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/trip-builder/trip-basket-store.ts:86"}, "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-6b671b4584c725a4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/trip-builder/submit-review.tsx:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/trip-builder/submit-review.tsx:68"}, "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-91dcbd64163a6d33", "name": "Commented-code block (6 lines) in apps/ota/src/components/deals/deal-quick-facts.tsx:7", "shortDescription": {"text": "Commented-code block (6 lines) in apps/ota/src/components/deals/deal-quick-facts.tsx:7"}, "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-16c5f5f57bb3031c", "name": "Commented-code block (6 lines) in apps/ota/src/app/robots.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in apps/ota/src/app/robots.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8083fd5660c69e92", "name": "Commented-code block (5 lines) in apps/ota/src/app/sitemap.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ota/src/app/sitemap.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a25dc468ddcd5860", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/app/sitemap.ts:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/app/sitemap.ts:96"}, "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-5c55702fa09040c0", "name": "Commented-code block (5 lines) in apps/ota/src/app/api/consumer-activity/route.ts:17", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ota/src/app/api/consumer-activity/route.ts:17"}, "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-a8f8afe2a595a057", "name": "Commented-code block (5 lines) in scripts/demo/lib/guard.ts:28", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/demo/lib/guard.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be7a4b0572f5cef6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/fix-851-unarchive-planning-itineraries.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/fix-851-unarchive-planning-itineraries.ts:47"}, "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-2548be29f802c60d", "name": "Commented-code block (8 lines) in scripts/migration/backfill-group-subtrip-payments.ts:366", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/migration/backfill-group-subtrip-payments.ts:366"}, "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-3a998a13710b9d8b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/backfill-group-subtrip-payments.ts:134", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/backfill-group-subtrip-payments.ts:134"}, "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-27a8534483e0d722", "name": "Commented-code block (6 lines) in scripts/migration/import-group-bookings.ts:274", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/migration/import-group-bookings.ts:274"}, "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-a25b90ab7e799e66", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/import-group-bookings.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/import-group-bookings.ts:47"}, "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-bc6abe0861cf306b", "name": "Commented-code block (7 lines) in scripts/migration/heal-issue844-insurance-premium.ts:196", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/migration/heal-issue844-insurance-premium.ts:196"}, "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-462fc13b6cfd18c9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/ingest-payroll-csv.ts:148", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/ingest-payroll-csv.ts:148"}, "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-52f99815bcf2411e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/extract-travelesolutions.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/extract-travelesolutions.ts:45"}, "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-80fccdb598a0903d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/supplier-dedup.ts:332", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/supplier-dedup.ts:332"}, "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-0f9eed976cb6d75a", "name": "Commented-code block (7 lines) in scripts/migration/verify-commission-mapping.ts:239", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/migration/verify-commission-mapping.ts:239"}, "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-cf99c4316fe086d0", "name": "Commented-code block (5 lines) in scripts/migration/resync-commission-tracking-clean.ts:221", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/migration/resync-commission-tracking-clean.ts:221"}, "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-22e9ed6f58fe612c", "name": "Commented-code block (6 lines) in scripts/migration/import-to-tailfire.ts:127", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/migration/import-to-tailfire.ts:127"}, "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-6bbd172a51da0088", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/import-to-tailfire.ts:174", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/import-to-tailfire.ts:174"}, "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-f1f186baddd0b191", "name": "Commented-code block (5 lines) in scripts/migration/backfill-issue834-payments.ts:241", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/migration/backfill-issue834-payments.ts:241"}, "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-cb295a7f1eb0ed69", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/backfill-issue834-payments.ts:151", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/backfill-issue834-payments.ts:151"}, "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-9aae399794fb7fcb", "name": "Commented-code block (5 lines) in scripts/migration/backfill-group-subtrip-travelers.ts:90", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/migration/backfill-group-subtrip-travelers.ts:90"}, "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-60d7670cd54ba3e5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/backfill-group-subtrip-travelers.ts:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/backfill-group-subtrip-travelers.ts:78"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b35835135445685", "name": "Commented-code block (5 lines) in scripts/migration/waive-historical-platform-fees.ts:117", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/migration/waive-historical-platform-fees.ts:117"}, "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-be9b4a6e96fbc189", "name": "Commented-code block (5 lines) in scripts/migration/precut-5-provision-prod-agents.ts:324", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/migration/precut-5-provision-prod-agents.ts:324"}, "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-d8d82d1b72bcdb12", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/e2e/flight-scenarios-e2e.ts:189", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/e2e/flight-scenarios-e2e.ts:189"}, "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-161b7e131a7002c0", "name": "Commented-code block (7 lines) in packages/shared-types/src/index.ts:27", "shortDescription": {"text": "Commented-code block (7 lines) in packages/shared-types/src/index.ts:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a48ee3f5440d859f", "name": "Commented-code block (5 lines) in packages/shared-types/src/api/commission.types.ts:197", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared-types/src/api/commission.types.ts:197"}, "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-2c2d4a1a554402ff", "name": "Commented-code block (5 lines) in packages/shared-types/src/api/components.types.ts:1023", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared-types/src/api/components.types.ts:1023"}, "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-ab8c8056e78b8f0e", "name": "Commented-code block (5 lines) in packages/shared-types/src/schemas/activity.schema.ts:23", "shortDescription": {"text": "Commented-code block (5 lines) in packages/shared-types/src/schemas/activity.schema.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3686484c5cb9dea5", "name": "Commented-code block (7 lines) in packages/database/scripts/replay-from-blank.ts:63", "shortDescription": {"text": "Commented-code block (7 lines) in packages/database/scripts/replay-from-blank.ts:63"}, "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-041b4859141e89d4", "name": "Legacy-named symbol `isLegacy` in packages/database/scripts/validate-migrations.ts:39", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in packages/database/scripts/validate-migrations.ts:39"}, "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-51c263f2d5e51cdc", "name": "Commented-code block (5 lines) in packages/database/scripts/validate-migrations.ts:113", "shortDescription": {"text": "Commented-code block (5 lines) in packages/database/scripts/validate-migrations.ts:113"}, "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-696b597fede3232f", "name": "Commented-code block (7 lines) in packages/database/src/schema/commission-checks.schema.ts:53", "shortDescription": {"text": "Commented-code block (7 lines) in packages/database/src/schema/commission-checks.schema.ts:53"}, "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-8c46ebd37f51152d", "name": "Commented-code block (5 lines) in packages/database/src/schema/custom-cruise-details.schema.ts:91", "shortDescription": {"text": "Commented-code block (5 lines) in packages/database/src/schema/custom-cruise-details.schema.ts:91"}, "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-8c12ca6b7f9a7342", "name": "Commented-code block (6 lines) in packages/database/src/schema/activity-pricing.schema.ts:62", "shortDescription": {"text": "Commented-code block (6 lines) in packages/database/src/schema/activity-pricing.schema.ts:62"}, "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-7c5d2e3a48f2a097", "name": "Commented-code block (5 lines) in packages/database/src/schema/email.schema.ts:98", "shortDescription": {"text": "Commented-code block (5 lines) in packages/database/src/schema/email.schema.ts:98"}, "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-61b6baa0313363e9", "name": "Commented-code block (5 lines) in packages/database/src/schema/insurance.schema.ts:99", "shortDescription": {"text": "Commented-code block (5 lines) in packages/database/src/schema/insurance.schema.ts:99"}, "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-adbcc42b85379e46", "name": "Commented-code block (6 lines) in packages/database/src/schema/flight-segments.schema.ts:21", "shortDescription": {"text": "Commented-code block (6 lines) in packages/database/src/schema/flight-segments.schema.ts:21"}, "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-f47b3afd40e2d4b0", "name": "Commented-code block (8 lines) in packages/database/src/schema/user-profiles.schema.ts:99", "shortDescription": {"text": "Commented-code block (8 lines) in packages/database/src/schema/user-profiles.schema.ts:99"}, "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-725ad92e44c20cf0", "name": "Commented-code block (5 lines) in packages/database/src/schema/trip-orders.schema.ts:69", "shortDescription": {"text": "Commented-code block (5 lines) in packages/database/src/schema/trip-orders.schema.ts:69"}, "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-634e2f6a6200f5b7", "name": "Commented-code block (7 lines) in packages/database/src/schema/financials.schema.ts:282", "shortDescription": {"text": "Commented-code block (7 lines) in packages/database/src/schema/financials.schema.ts:282"}, "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-32950460130430ec", "name": "Commented-code block (5 lines) in packages/trip-proposal-ui/src/components/ProposalShell.tsx:54", "shortDescription": {"text": "Commented-code block (5 lines) in packages/trip-proposal-ui/src/components/ProposalShell.tsx:54"}, "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-fb87f14083523571", "name": "147 env vars used in code but missing from .env.example", "shortDescription": {"text": "147 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_EMAIL`, `ADMIN_FALLBACK_USER_ID`, `ADMIN_URL`, `ADVISOR_EMAILS`, `AERODATABOX_API_KEY`, `AERODATABOX_API_URL`, `AERODATABOX_RATE_LIMIT_PER_DAY`, `AERODATABOX_RATE_LIMIT_PER_HOUR` + 139 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-232dbfeaa2337830", "name": "Dangling fetch: GET https://api.unsplash.com/photos/random?count=1 (apps/api/src/api-credentials/api-credentials.service", "shortDescription": {"text": "Dangling fetch: GET https://api.unsplash.com/photos/random?count=1 (apps/api/src/api-credentials/api-credentials.service.ts:703)"}, "fullDescription": {"text": "`apps/api/src/api-credentials/api-credentials.service.ts:703` calls `GET https://api.unsplash.com/photos/random?count=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.unsplash.com/photos/random`\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-53438734be658a96", "name": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/airports/iata/${iataCode} (apps/api/src/trips/geocoding.service.t", "shortDescription": {"text": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/airports/iata/${iataCode} (apps/api/src/trips/geocoding.service.ts:106)"}, "fullDescription": {"text": "`apps/api/src/trips/geocoding.service.ts:106` calls `GET https://aerodatabox.p.rapidapi.com/airports/iata/${iataCode}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/aerodatabox.p.rapidapi.com/airports/iata/<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-a314b71ea9ec0d29", "name": "Dangling fetch: POST https://places.googleapis.com/v1/places:searchText (apps/api/src/trips/geocoding.service.ts:179)", "shortDescription": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:searchText (apps/api/src/trips/geocoding.service.ts:179)"}, "fullDescription": {"text": "`apps/api/src/trips/geocoding.service.ts:179` 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-1971686cd72b8cd2", "name": "Dangling fetch: POST https://places.googleapis.com/v1/places:searchText (apps/api/src/api-health/api-health.service.ts:3", "shortDescription": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:searchText (apps/api/src/api-health/api-health.service.ts:354)"}, "fullDescription": {"text": "`apps/api/src/api-health/api-health.service.ts:354` 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-b879e75d9b71bba3", "name": "Dangling fetch: GET https://api.stripe.com/v1/account (apps/api/src/api-health/api-health.service.ts:376)", "shortDescription": {"text": "Dangling fetch: GET https://api.stripe.com/v1/account (apps/api/src/api-health/api-health.service.ts:376)"}, "fullDescription": {"text": "`apps/api/src/api-health/api-health.service.ts:376` calls `GET https://api.stripe.com/v1/account` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.stripe.com/v1/account`\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-0ccd8e66ee1e726a", "name": "Dangling fetch: GET https://api.resend.com/domains (apps/api/src/api-health/api-health.service.ts:393)", "shortDescription": {"text": "Dangling fetch: GET https://api.resend.com/domains (apps/api/src/api-health/api-health.service.ts:393)"}, "fullDescription": {"text": "`apps/api/src/api-health/api-health.service.ts:393` calls `GET https://api.resend.com/domains` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/domains`\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-465684fb6e658e8f", "name": "Dangling fetch: GET https://api.unsplash.com/photos/random?count=1 (apps/api/src/api-health/api-health.service.ts:410)", "shortDescription": {"text": "Dangling fetch: GET https://api.unsplash.com/photos/random?count=1 (apps/api/src/api-health/api-health.service.ts:410)"}, "fullDescription": {"text": "`apps/api/src/api-health/api-health.service.ts:410` calls `GET https://api.unsplash.com/photos/random?count=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.unsplash.com/photos/random`\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-59ad2cdedd13cbfa", "name": "Dangling fetch: GET https://api.openai.com/v1/models (apps/api/src/api-health/api-health.service.ts:427)", "shortDescription": {"text": "Dangling fetch: GET https://api.openai.com/v1/models (apps/api/src/api-health/api-health.service.ts:427)"}, "fullDescription": {"text": "`apps/api/src/api-health/api-health.service.ts:427` calls `GET https://api.openai.com/v1/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/models`\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-7cc7c74275098bf6", "name": "Dangling fetch: GET https://v6.exchangerate-api.com/v6/${apiKey}/latest/CAD (apps/api/src/api-health/api-health.service.", "shortDescription": {"text": "Dangling fetch: GET https://v6.exchangerate-api.com/v6/${apiKey}/latest/CAD (apps/api/src/api-health/api-health.service.ts:444)"}, "fullDescription": {"text": "`apps/api/src/api-health/api-health.service.ts:444` calls `GET https://v6.exchangerate-api.com/v6/${apiKey}/latest/CAD` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/v6.exchangerate-api.com/v6/<p>/latest/cad`\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-94a0b0f8295f89f3", "name": "Dangling fetch: GET https://api.backblazeb2.com/b2api/v3/b2_authorize_account (apps/api/src/api-health/api-health.servic", "shortDescription": {"text": "Dangling fetch: GET https://api.backblazeb2.com/b2api/v3/b2_authorize_account (apps/api/src/api-health/api-health.service.ts:509)"}, "fullDescription": {"text": "`apps/api/src/api-health/api-health.service.ts:509` calls `GET https://api.backblazeb2.com/b2api/v3/b2_authorize_account` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.backblazeb2.com/b2api/v3/b2_authorize_account`\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-1b2ba4dbf294d11f", "name": "Dangling fetch: GET https://serpapi.com/search.json?${params} (apps/api/src/destinations/serpapi.service.ts:77)", "shortDescription": {"text": "Dangling fetch: GET https://serpapi.com/search.json?${params} (apps/api/src/destinations/serpapi.service.ts:77)"}, "fullDescription": {"text": "`apps/api/src/destinations/serpapi.service.ts:77` calls `GET https://serpapi.com/search.json?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/serpapi.com/search.json`\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-dcfa54a04bceaeab", "name": "Dangling fetch: POST /auth/signout (apps/admin/src/app/auth/reset-password/page.tsx:119)", "shortDescription": {"text": "Dangling fetch: POST /auth/signout (apps/admin/src/app/auth/reset-password/page.tsx:119)"}, "fullDescription": {"text": "`apps/admin/src/app/auth/reset-password/page.tsx:119` calls `POST /auth/signout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/signout`\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-3c97df869889bc92", "name": "Dangling fetch: POST /auth/signout (apps/admin/src/app/auth/set-password/page.tsx:69)", "shortDescription": {"text": "Dangling fetch: POST /auth/signout (apps/admin/src/app/auth/set-password/page.tsx:69)"}, "fullDescription": {"text": "`apps/admin/src/app/auth/set-password/page.tsx:69` calls `POST /auth/signout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/signout`\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-84497df12d91de96", "name": "Dangling fetch: POST /api/mfa-skip (apps/admin/src/app/auth/mfa-enroll/page.tsx:113)", "shortDescription": {"text": "Dangling fetch: POST /api/mfa-skip (apps/admin/src/app/auth/mfa-enroll/page.tsx:113)"}, "fullDescription": {"text": "`apps/admin/src/app/auth/mfa-enroll/page.tsx:113` calls `POST /api/mfa-skip` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mfa-skip`\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-c1cd14ebebb701fb", "name": "Dangling fetch: POST /api/leads (apps/ota/src/components/layout/contact-form.tsx:48)", "shortDescription": {"text": "Dangling fetch: POST /api/leads (apps/ota/src/components/layout/contact-form.tsx:48)"}, "fullDescription": {"text": "`apps/ota/src/components/layout/contact-form.tsx:48` calls `POST /api/leads` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/leads`\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-a3a8237bdc1c4fc2", "name": "Dangling fetch: GET /api/hotels/search?${qs} (apps/ota/src/components/hub/sections/client-hotel-results.tsx:130)", "shortDescription": {"text": "Dangling fetch: GET /api/hotels/search?${qs} (apps/ota/src/components/hub/sections/client-hotel-results.tsx:130)"}, "fullDescription": {"text": "`apps/ota/src/components/hub/sections/client-hotel-results.tsx:130` calls `GET /api/hotels/search?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/hotels/search`\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-52ecced78b773148", "name": "Dangling fetch: GET /api/flights/search?${qs} (apps/ota/src/components/hub/sections/client-flight-results.tsx:147)", "shortDescription": {"text": "Dangling fetch: GET /api/flights/search?${qs} (apps/ota/src/components/hub/sections/client-flight-results.tsx:147)"}, "fullDescription": {"text": "`apps/ota/src/components/hub/sections/client-flight-results.tsx:147` calls `GET /api/flights/search?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/flights/search`\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-56e8a7b3a68c3326", "name": "Dangling fetch: POST /api/leads (apps/ota/src/components/join/register-form.tsx:75)", "shortDescription": {"text": "Dangling fetch: POST /api/leads (apps/ota/src/components/join/register-form.tsx:75)"}, "fullDescription": {"text": "`apps/ota/src/components/join/register-form.tsx:75` calls `POST /api/leads` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/leads`\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-3f77cfc1aaabbbc1", "name": "Dangling fetch: GET /api/airports?keyword=${encodeURIComponent(keyword)} (apps/ota/src/components/search/airport-autocom", "shortDescription": {"text": "Dangling fetch: GET /api/airports?keyword=${encodeURIComponent(keyword)} (apps/ota/src/components/search/airport-autocomplete.tsx:51)"}, "fullDescription": {"text": "`apps/ota/src/components/search/airport-autocomplete.tsx:51` calls `GET /api/airports?keyword=${encodeURIComponent(keyword)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/airports`\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-c9f009ece93c3f05", "name": "Dangling fetch: GET /api/destinations?${params.toString()} (apps/ota/src/components/destinations/destination-gallery.tsx", "shortDescription": {"text": "Dangling fetch: GET /api/destinations?${params.toString()} (apps/ota/src/components/destinations/destination-gallery.tsx:48)"}, "fullDescription": {"text": "`apps/ota/src/components/destinations/destination-gallery.tsx:48` calls `GET /api/destinations?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/destinations`\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-8d9c1b06521b0254", "name": "Dangling fetch: PATCH /api/trip-requests/${requestId}/identity (apps/ota/src/components/trip-builder/submit-review.tsx:4", "shortDescription": {"text": "Dangling fetch: PATCH /api/trip-requests/${requestId}/identity (apps/ota/src/components/trip-builder/submit-review.tsx:49)"}, "fullDescription": {"text": "`apps/ota/src/components/trip-builder/submit-review.tsx:49` calls `PATCH /api/trip-requests/${requestId}/identity` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trip-requests/<p>/identity`\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-472fda8ea2062779", "name": "Dangling fetch: POST /api/trip-requests/${requestId}/submit (apps/ota/src/components/trip-builder/submit-review.tsx:68)", "shortDescription": {"text": "Dangling fetch: POST /api/trip-requests/${requestId}/submit (apps/ota/src/components/trip-builder/submit-review.tsx:68)"}, "fullDescription": {"text": "`apps/ota/src/components/trip-builder/submit-review.tsx:68` calls `POST /api/trip-requests/${requestId}/submit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trip-requests/<p>/submit`\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-c7277adebef537c8", "name": "Dangling fetch: POST /api/trip-requests/${requestId}/share (apps/ota/src/components/trip-builder/share-button.tsx:21)", "shortDescription": {"text": "Dangling fetch: POST /api/trip-requests/${requestId}/share (apps/ota/src/components/trip-builder/share-button.tsx:21)"}, "fullDescription": {"text": "`apps/ota/src/components/trip-builder/share-button.tsx:21` calls `POST /api/trip-requests/${requestId}/share` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trip-requests/<p>/share`\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-23c29000f0f5b644", "name": "Dangling fetch: POST /api/leads (apps/ota/src/components/advisor/advisor-contact-form.tsx:26)", "shortDescription": {"text": "Dangling fetch: POST /api/leads (apps/ota/src/components/advisor/advisor-contact-form.tsx:26)"}, "fullDescription": {"text": "`apps/ota/src/components/advisor/advisor-contact-form.tsx:26` calls `POST /api/leads` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/leads`\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-223a5e745a3e6fc8", "name": "Dangling fetch: POST /api/consumer-activity (apps/ota/src/lib/tracking.ts:22)", "shortDescription": {"text": "Dangling fetch: POST /api/consumer-activity (apps/ota/src/lib/tracking.ts:22)"}, "fullDescription": {"text": "`apps/ota/src/lib/tracking.ts:22` calls `POST /api/consumer-activity` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/consumer-activity`\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-fa948c53fbed1040", "name": "Unused endpoint: GET /debug-sentry", "shortDescription": {"text": "Unused endpoint: GET /debug-sentry"}, "fullDescription": {"text": "`apps/api/src/app.controller.ts` declares `GET /debug-sentry` 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-243359322763546b", "name": "Unused endpoint: GET /reference-data/cruise-lines", "shortDescription": {"text": "Unused endpoint: GET /reference-data/cruise-lines"}, "fullDescription": {"text": "`apps/api/src/reference-data/reference-data.controller.ts` declares `GET /reference-data/cruise-lines` 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-9feb09e1ab618f29", "name": "Unused endpoint: GET /reference-data/cruise-ships", "shortDescription": {"text": "Unused endpoint: GET /reference-data/cruise-ships"}, "fullDescription": {"text": "`apps/api/src/reference-data/reference-data.controller.ts` declares `GET /reference-data/cruise-ships` 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-29835d34d4f9021e", "name": "Unused endpoint: GET /reference-data/cruise-regions", "shortDescription": {"text": "Unused endpoint: GET /reference-data/cruise-regions"}, "fullDescription": {"text": "`apps/api/src/reference-data/reference-data.controller.ts` declares `GET /reference-data/cruise-regions` 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-1df454497e7be8a7", "name": "Unused endpoint: GET /reference-data/cruise-ports", "shortDescription": {"text": "Unused endpoint: GET /reference-data/cruise-ports"}, "fullDescription": {"text": "`apps/api/src/reference-data/reference-data.controller.ts` declares `GET /reference-data/cruise-ports` 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-16055747c5cb9c99", "name": "Unused endpoint: GET /reference-data/metadata", "shortDescription": {"text": "Unused endpoint: GET /reference-data/metadata"}, "fullDescription": {"text": "`apps/api/src/reference-data/reference-data.controller.ts` declares `GET /reference-data/metadata` 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-5b2c238099805732", "name": "Unused endpoint: POST /reference-data/refresh", "shortDescription": {"text": "Unused endpoint: POST /reference-data/refresh"}, "fullDescription": {"text": "`apps/api/src/reference-data/reference-data.controller.ts` declares `POST /reference-data/refresh` 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-4274890eaf4c29e9", "name": "Unused endpoint: USE /admin/queues", "shortDescription": {"text": "Unused endpoint: USE /admin/queues"}, "fullDescription": {"text": "`apps/api/src/automation/admin/bull-board.setup.ts` declares `USE /admin/queues` 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-59d4d3ce92941ac3", "name": "Unused endpoint: GET /admin/automation/queues", "shortDescription": {"text": "Unused endpoint: GET /admin/automation/queues"}, "fullDescription": {"text": "`apps/api/src/automation/admin/automation.controller.ts` declares `GET /admin/automation/queues` 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-e835890d4758e103", "name": "Unused endpoint: GET /admin/automation/queues/:name/delayed", "shortDescription": {"text": "Unused endpoint: GET /admin/automation/queues/:name/delayed"}, "fullDescription": {"text": "`apps/api/src/automation/admin/automation.controller.ts` declares `GET /admin/automation/queues/:name/delayed` 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-f7e58e95e8b24d5f", "name": "Unused endpoint: GET /admin/automation/jobs/:id", "shortDescription": {"text": "Unused endpoint: GET /admin/automation/jobs/:id"}, "fullDescription": {"text": "`apps/api/src/automation/admin/automation.controller.ts` declares `GET /admin/automation/jobs/: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-c2f00134cd526cb1", "name": "Unused endpoint: DELETE /admin/automation/jobs/:id", "shortDescription": {"text": "Unused endpoint: DELETE /admin/automation/jobs/:id"}, "fullDescription": {"text": "`apps/api/src/automation/admin/automation.controller.ts` declares `DELETE /admin/automation/jobs/: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-b54e843444dc4cb2", "name": "Unused endpoint: POST /admin/automation/jobs/schedule", "shortDescription": {"text": "Unused endpoint: POST /admin/automation/jobs/schedule"}, "fullDescription": {"text": "`apps/api/src/automation/admin/automation.controller.ts` declares `POST /admin/automation/jobs/schedule` 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-7ec6ef77a25046cf", "name": "Unused endpoint: POST /admin/automation/trips/backfill", "shortDescription": {"text": "Unused endpoint: POST /admin/automation/trips/backfill"}, "fullDescription": {"text": "`apps/api/src/automation/admin/automation.controller.ts` declares `POST /admin/automation/trips/backfill` 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-fa2a08306028e25b", "name": "Unused endpoint: DELETE /admin/automation/jobs/pattern", "shortDescription": {"text": "Unused endpoint: DELETE /admin/automation/jobs/pattern"}, "fullDescription": {"text": "`apps/api/src/automation/admin/automation.controller.ts` declares `DELETE /admin/automation/jobs/pattern` 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-a9baed25bd1e037c", "name": "Unused endpoint: GET /unsplash/status", "shortDescription": {"text": "Unused endpoint: GET /unsplash/status"}, "fullDescription": {"text": "`apps/api/src/unsplash/unsplash.controller.ts` declares `GET /unsplash/status` 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-611c0ccd9f6d4a9b", "name": "Unused endpoint: GET /unsplash/search", "shortDescription": {"text": "Unused endpoint: GET /unsplash/search"}, "fullDescription": {"text": "`apps/api/src/unsplash/unsplash.controller.ts` declares `GET /unsplash/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-7df3b5d8bd32daee", "name": "Unused endpoint: GET /activities/:activityId/splits", "shortDescription": {"text": "Unused endpoint: GET /activities/:activityId/splits"}, "fullDescription": {"text": "`apps/api/src/financials/traveller-splits.controller.ts` declares `GET /activities/:activityId/splits` 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-5e4f069d405c10d4", "name": "Unused endpoint: PUT /activities/:activityId/splits", "shortDescription": {"text": "Unused endpoint: PUT /activities/:activityId/splits"}, "fullDescription": {"text": "`apps/api/src/financials/traveller-splits.controller.ts` declares `PUT /activities/:activityId/splits` 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-c8cdcd67e26f7b64", "name": "Unused endpoint: DELETE /activities/:activityId/splits", "shortDescription": {"text": "Unused endpoint: DELETE /activities/:activityId/splits"}, "fullDescription": {"text": "`apps/api/src/financials/traveller-splits.controller.ts` declares `DELETE /activities/:activityId/splits` 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-c7549f0f528dacdd", "name": "Unused endpoint: GET /trips/:tripId/travellers/:travellerId/splits", "shortDescription": {"text": "Unused endpoint: GET /trips/:tripId/travellers/:travellerId/splits"}, "fullDescription": {"text": "`apps/api/src/financials/traveller-splits.controller.ts` declares `GET /trips/:tripId/travellers/:travellerId/splits` 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-bcae10047822ef6c", "name": "Unused endpoint: GET /trips/:tripId/financial-summary", "shortDescription": {"text": "Unused endpoint: GET /trips/:tripId/financial-summary"}, "fullDescription": {"text": "`apps/api/src/financials/financial-summary.controller.ts` declares `GET /trips/:tripId/financial-summary` 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-161e1316fefe9c04", "name": "Unused endpoint: GET /agencies/:agencyId/settings", "shortDescription": {"text": "Unused endpoint: GET /agencies/:agencyId/settings"}, "fullDescription": {"text": "`apps/api/src/financials/stripe-connect.controller.ts` declares `GET /agencies/:agencyId/settings` 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-466fc096601e1eef", "name": "Unused endpoint: PATCH /agencies/:agencyId/settings", "shortDescription": {"text": "Unused endpoint: PATCH /agencies/:agencyId/settings"}, "fullDescription": {"text": "`apps/api/src/financials/stripe-connect.controller.ts` declares `PATCH /agencies/:agencyId/settings` 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-309765f11d613f92", "name": "Unused endpoint: POST /agencies/:agencyId/stripe/onboard", "shortDescription": {"text": "Unused endpoint: POST /agencies/:agencyId/stripe/onboard"}, "fullDescription": {"text": "`apps/api/src/financials/stripe-connect.controller.ts` declares `POST /agencies/:agencyId/stripe/onboard` 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-f3df7ee7e4f134fc", "name": "Unused endpoint: GET /agencies/:agencyId/stripe/status", "shortDescription": {"text": "Unused endpoint: GET /agencies/:agencyId/stripe/status"}, "fullDescription": {"text": "`apps/api/src/financials/stripe-connect.controller.ts` declares `GET /agencies/:agencyId/stripe/status` 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-7ec982f88b5dce5c", "name": "Unused endpoint: POST /agencies/:agencyId/stripe/dashboard", "shortDescription": {"text": "Unused endpoint: POST /agencies/:agencyId/stripe/dashboard"}, "fullDescription": {"text": "`apps/api/src/financials/stripe-connect.controller.ts` declares `POST /agencies/:agencyId/stripe/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-97fa9c83bada31c0", "name": "Unused endpoint: POST /service-fees/:id/invoice", "shortDescription": {"text": "Unused endpoint: POST /service-fees/:id/invoice"}, "fullDescription": {"text": "`apps/api/src/financials/stripe-invoice.controller.ts` declares `POST /service-fees/:id/invoice` 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-9b7280804ac001e8", "name": "Unused endpoint: POST /service-fees/:id/stripe-refund", "shortDescription": {"text": "Unused endpoint: POST /service-fees/:id/stripe-refund"}, "fullDescription": {"text": "`apps/api/src/financials/stripe-invoice.controller.ts` declares `POST /service-fees/:id/stripe-refund` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1dfcc9529630142e", "name": "Unused endpoint: POST /webhooks/stripe", "shortDescription": {"text": "Unused endpoint: POST /webhooks/stripe"}, "fullDescription": {"text": "`apps/api/src/financials/stripe-invoice.controller.ts` declares `POST /webhooks/stripe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-461edc8fb8a9ea57", "name": "Unused endpoint: GET /exchange-rates/:from/:to", "shortDescription": {"text": "Unused endpoint: GET /exchange-rates/:from/:to"}, "fullDescription": {"text": "`apps/api/src/financials/exchange-rates.controller.ts` declares `GET /exchange-rates/:from/:to` 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-6002ee513434d1bf", "name": "Unused endpoint: POST /exchange-rates/convert", "shortDescription": {"text": "Unused endpoint: POST /exchange-rates/convert"}, "fullDescription": {"text": "`apps/api/src/financials/exchange-rates.controller.ts` declares `POST /exchange-rates/convert` 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-03a528811f66b893", "name": "Unused endpoint: GET /exchange-rates/currencies", "shortDescription": {"text": "Unused endpoint: GET /exchange-rates/currencies"}, "fullDescription": {"text": "`apps/api/src/financials/exchange-rates.controller.ts` declares `GET /exchange-rates/currencies` 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-b7b3fde1054c0817", "name": "Unused endpoint: GET /exchange-rates/:base/all", "shortDescription": {"text": "Unused endpoint: GET /exchange-rates/:base/all"}, "fullDescription": {"text": "`apps/api/src/financials/exchange-rates.controller.ts` declares `GET /exchange-rates/:base/all` 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-daef437f6efff5a3", "name": "Unused endpoint: GET /trips/:tripId/service-fees", "shortDescription": {"text": "Unused endpoint: GET /trips/:tripId/service-fees"}, "fullDescription": {"text": "`apps/api/src/financials/service-fees.controller.ts` declares `GET /trips/:tripId/service-fees` 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-1cbe4e9de3136fc3", "name": "Unused endpoint: GET /service-fees/:id", "shortDescription": {"text": "Unused endpoint: GET /service-fees/:id"}, "fullDescription": {"text": "`apps/api/src/financials/service-fees.controller.ts` declares `GET /service-fees/: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-6f42bed4ad0f8856", "name": "Unused endpoint: POST /trips/:tripId/service-fees", "shortDescription": {"text": "Unused endpoint: POST /trips/:tripId/service-fees"}, "fullDescription": {"text": "`apps/api/src/financials/service-fees.controller.ts` declares `POST /trips/:tripId/service-fees` 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-778b64bd7b197ac0", "name": "Unused endpoint: PATCH /service-fees/:id", "shortDescription": {"text": "Unused endpoint: PATCH /service-fees/:id"}, "fullDescription": {"text": "`apps/api/src/financials/service-fees.controller.ts` declares `PATCH /service-fees/: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-73ad88dc8f2a428d", "name": "Unused endpoint: POST /service-fees/:id/send", "shortDescription": {"text": "Unused endpoint: POST /service-fees/:id/send"}, "fullDescription": {"text": "`apps/api/src/financials/service-fees.controller.ts` declares `POST /service-fees/:id/send` 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-13f1defd295c4cd6", "name": "Unused endpoint: POST /service-fees/:id/mark-paid", "shortDescription": {"text": "Unused endpoint: POST /service-fees/:id/mark-paid"}, "fullDescription": {"text": "`apps/api/src/financials/service-fees.controller.ts` declares `POST /service-fees/:id/mark-paid` 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-b41ce297e52695d2", "name": "Unused endpoint: POST /service-fees/:id/refund", "shortDescription": {"text": "Unused endpoint: POST /service-fees/:id/refund"}, "fullDescription": {"text": "`apps/api/src/financials/service-fees.controller.ts` declares `POST /service-fees/:id/refund` 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-06625a4314d5ffab", "name": "Unused endpoint: POST /service-fees/:id/cancel", "shortDescription": {"text": "Unused endpoint: POST /service-fees/:id/cancel"}, "fullDescription": {"text": "`apps/api/src/financials/service-fees.controller.ts` declares `POST /service-fees/:id/cancel` 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-a360df02c14c1b25", "name": "Unused endpoint: DELETE /service-fees/:id", "shortDescription": {"text": "Unused endpoint: DELETE /service-fees/:id"}, "fullDescription": {"text": "`apps/api/src/financials/service-fees.controller.ts` declares `DELETE /service-fees/: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-5e658d6542534e42", "name": "Unused endpoint: POST /trips/:tripId/trip-orders", "shortDescription": {"text": "Unused endpoint: POST /trips/:tripId/trip-orders"}, "fullDescription": {"text": "`apps/api/src/financials/trip-order.controller.ts` declares `POST /trips/:tripId/trip-orders` 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-1bb75640fd6aadf2", "name": "Unused endpoint: GET /trips/:tripId/trip-orders", "shortDescription": {"text": "Unused endpoint: GET /trips/:tripId/trip-orders"}, "fullDescription": {"text": "`apps/api/src/financials/trip-order.controller.ts` declares `GET /trips/:tripId/trip-orders` 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-2f06b3011ab40c07", "name": "Unused endpoint: GET /trips/:tripId/trip-orders/latest", "shortDescription": {"text": "Unused endpoint: GET /trips/:tripId/trip-orders/latest"}, "fullDescription": {"text": "`apps/api/src/financials/trip-order.controller.ts` declares `GET /trips/:tripId/trip-orders/latest` 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-cc2b7c17e7f93256", "name": "Unused endpoint: GET /trip-orders/:id", "shortDescription": {"text": "Unused endpoint: GET /trip-orders/:id"}, "fullDescription": {"text": "`apps/api/src/financials/trip-order.controller.ts` declares `GET /trip-orders/: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-51f8a4b961c29cd6", "name": "Unused endpoint: GET /trip-orders/:id/compliance", "shortDescription": {"text": "Unused endpoint: GET /trip-orders/:id/compliance"}, "fullDescription": {"text": "`apps/api/src/financials/trip-order.controller.ts` declares `GET /trip-orders/:id/compliance` 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-607b6a68926dd669", "name": "Unused endpoint: POST /trip-orders/:id/finalize", "shortDescription": {"text": "Unused endpoint: POST /trip-orders/:id/finalize"}, "fullDescription": {"text": "`apps/api/src/financials/trip-order.controller.ts` declares `POST /trip-orders/:id/finalize` 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-df75069b6c9319da", "name": "Unused endpoint: POST /trip-orders/:id/download", "shortDescription": {"text": "Unused endpoint: POST /trip-orders/:id/download"}, "fullDescription": {"text": "`apps/api/src/financials/trip-order.controller.ts` declares `POST /trip-orders/:id/download` 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/20693"}, "properties": {"repository": "Systemsaholic/tailfire", "repoUrl": "https://github.com/Systemsaholic/tailfire", "branch": "main"}, "results": [{"ruleId": "scanner-5d6fe450d3f62b78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/client/src/components/documents/document-upload-modal.tsx:234"}, "properties": {"repobilityId": "257fc020e56a4d35", "scanner": "scanner-primary", "fingerprint": "5d6fe450d3f62b78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f12846d1b473e230", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/client/src/app/(dashboard)/page.tsx:308"}, "properties": {"repobilityId": "d8b7629a5f52065b", "scanner": "scanner-primary", "fingerprint": "f12846d1b473e230", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f45ee236bccdc4f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/client/src/app/(dashboard)/documents/page.tsx:251"}, "properties": {"repobilityId": "31b54f2688b7d619", "scanner": "scanner-primary", "fingerprint": "f45ee236bccdc4f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2ad79487684a0307", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/client/src/app/(dashboard)/preferences/page.tsx:6"}, "properties": {"repobilityId": "36cc3ef88fa2b7bd", "scanner": "scanner-primary", "fingerprint": "2ad79487684a0307", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-73262d5fb4c26c24", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/auth/guards/mfa.guard.ts:63"}, "properties": {"repobilityId": "e886f30efcbebfd0", "scanner": "scanner-primary", "fingerprint": "73262d5fb4c26c24", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b2c00c7f6b41bbff", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/activity-media.controller.ts:972"}, "properties": {"repobilityId": "16ac17239149f407", "scanner": "scanner-primary", "fingerprint": "b2c00c7f6b41bbff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1285eac98c053968", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/activity-documents.controller.ts:270"}, "properties": {"repobilityId": "250a310bc6990059", "scanner": "scanner-primary", "fingerprint": "1285eac98c053968", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-fa54b968ce58f3e9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/__tests__/reference-numbers.spec.ts:81"}, "properties": {"repobilityId": "991b51c0ce5c3118", "scanner": "scanner-primary", "fingerprint": "fa54b968ce58f3e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bd8e4bdfa0ba7503", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/trips/__tests__/trips-workflow.spec.ts:97"}, "properties": {"repobilityId": "11f307a5f3e672c0", "scanner": "scanner-primary", "fingerprint": "bd8e4bdfa0ba7503", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ba72efd2665faf55", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/ic-payouts/notifications/ic-payout-notifications.service.ts:472"}, "properties": {"repobilityId": "2d0edd5e0c665313", "scanner": "scanner-primary", "fingerprint": "ba72efd2665faf55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c95644911fc9bdc3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/ic-payouts/ic-tax-profiles/ic-tax-profiles.service.ts:121"}, "properties": {"repobilityId": "dc9c487e87e825b6", "scanner": "scanner-primary", "fingerprint": "c95644911fc9bdc3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6f69a7d87068db4d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/ic-payouts/payout-accounts/ic-payout-accounts.service.ts:142"}, "properties": {"repobilityId": "a0e69e543aa09e2e", "scanner": "scanner-primary", "fingerprint": "6f69a7d87068db4d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1677d4cbff4a2dd6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/storage/providers/__tests__/r2-media-integration.test.ts:15"}, "properties": {"repobilityId": "79c6e456c1b949bc", "scanner": "scanner-primary", "fingerprint": "1677d4cbff4a2dd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a7a0d7961795f4c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/storage/providers/__tests__/backblaze-b2.provider.integration.spec.ts:58"}, "properties": {"repobilityId": "2e4022b74e1dce82", "scanner": "scanner-primary", "fingerprint": "2a7a0d7961795f4c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-390ed9212f983fdb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/storage/providers/__tests__/r2-integration.test.ts:12"}, "properties": {"repobilityId": "389a98625131230c", "scanner": "scanner-primary", "fingerprint": "390ed9212f983fdb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2aa32e34e4efd842", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/cascade-confirmation-dialog.tsx:108"}, "properties": {"repobilityId": "5efb9174dc2db747", "scanner": "scanner-primary", "fingerprint": "2aa32e34e4efd842", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dcbf801f8e068659", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/file-preview-modal.tsx:132"}, "properties": {"repobilityId": "5341ba2cc2468001", "scanner": "scanner-primary", "fingerprint": "dcbf801f8e068659", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-541a58dc87ef7b4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/hotel-search-panel.tsx:186"}, "properties": {"repobilityId": "4520fb8fe2dffb9e", "scanner": "scanner-primary", "fingerprint": "541a58dc87ef7b4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71678d7899e4196f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/activity-search-panel.tsx:165"}, "properties": {"repobilityId": "3c21d047e73c8bdf", "scanner": "scanner-primary", "fingerprint": "71678d7899e4196f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af128ff965c5204e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transfer-search-panel.tsx:354"}, "properties": {"repobilityId": "9ecf2dd9ecfff68c", "scanner": "scanner-primary", "fingerprint": "af128ff965c5204e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24fef1361fd8553a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/media-uploader.tsx:686"}, "properties": {"repobilityId": "9f25c08ed1844499", "scanner": "scanner-primary", "fingerprint": "24fef1361fd8553a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c92bface643690dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/layout/super-search-dialog.tsx:100"}, "properties": {"repobilityId": "0b18c4601e8f6141", "scanner": "scanner-primary", "fingerprint": "c92bface643690dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e23054108af4b134", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/library/add-to-trip-dialog.tsx:404"}, "properties": {"repobilityId": "f10ee88c85bbbbb3", "scanner": "scanner-primary", "fingerprint": "e23054108af4b134", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-430c4a4c88de1f8f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/trips/MoveToGroupDialog.tsx:282"}, "properties": {"repobilityId": "15f56fb2e5ea44ea", "scanner": "scanner-primary", "fingerprint": "430c4a4c88de1f8f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2f1a91e7e234e17", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/shared/component-media-tab.tsx:419"}, "properties": {"repobilityId": "08e731c20431aa2c", "scanner": "scanner-primary", "fingerprint": "d2f1a91e7e234e17", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea555fa933fe7dd4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/flight-journey-display.tsx:157"}, "properties": {"repobilityId": "41a6647e31a3c89e", "scanner": "scanner-primary", "fingerprint": "ea555fa933fe7dd4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-62df4d811f3969a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/airport-autocomplete.tsx:181"}, "properties": {"repobilityId": "81d1a25c3b92a4dc", "scanner": "scanner-primary", "fingerprint": "62df4d811f3969a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cecdb4619d4a7368", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/flight-search-result-card.tsx:209"}, "properties": {"repobilityId": "06e9a7b285f8c590", "scanner": "scanner-primary", "fingerprint": "cecdb4619d4a7368", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00b8560941fd6f27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/transport-journey-display.tsx:241"}, "properties": {"repobilityId": "a33dd5f37e0023eb", "scanner": "scanner-primary", "fingerprint": "00b8560941fd6f27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1a06135fe7a9811", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/airline-autocomplete.tsx:117"}, "properties": {"repobilityId": "482c3d3a38669fc7", "scanner": "scanner-primary", "fingerprint": "f1a06135fe7a9811", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c3df7e6bee5ec18b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/combobox.tsx:104"}, "properties": {"repobilityId": "315b0e92aa5fd016", "scanner": "scanner-primary", "fingerprint": "c3df7e6bee5ec18b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7a8d99142c99b5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/packages/packages-list.tsx:727"}, "properties": {"repobilityId": "9af8530470fce3cc", "scanner": "scanner-primary", "fingerprint": "c7a8d99142c99b5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c4f8385aeb82d1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/packages/activity-linker-sheet.tsx:232"}, "properties": {"repobilityId": "927e06b0e50ecced", "scanner": "scanner-primary", "fingerprint": "0c4f8385aeb82d1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ecc4b1b3e2c82bfe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/packages/packages-table.tsx:798"}, "properties": {"repobilityId": "b8dbee091fd4949b", "scanner": "scanner-primary", "fingerprint": "ecc4b1b3e2c82bfe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80edc7c538da6877", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/suppliers/supplier-combobox.tsx:169"}, "properties": {"repobilityId": "e37d49ef48ee7294", "scanner": "scanner-primary", "fingerprint": "80edc7c538da6877", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b5bed914539af1f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/activities/activity-comments-panel.tsx:77"}, "properties": {"repobilityId": "e34b55ef42508928", "scanner": "scanner-primary", "fingerprint": "b5bed914539af1f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-157b334afaaa31ef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/notes/NoteCard.tsx:78"}, "properties": {"repobilityId": "53f60c6efb70f183", "scanner": "scanner-primary", "fingerprint": "157b334afaaa31ef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b5742c41e0efbea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/contacts/ConsumerInsights.tsx:197"}, "properties": {"repobilityId": "14ab092cea913c90", "scanner": "scanner-primary", "fingerprint": "6b5742c41e0efbea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cdadf0fee9cc2b4b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/email-composer/recipient-token-input.tsx:209"}, "properties": {"repobilityId": "bfc51b465f09ed06", "scanner": "scanner-primary", "fingerprint": "cdadf0fee9cc2b4b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fccfcdfba4770a1a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/email-composer/attachment-bar.tsx:94"}, "properties": {"repobilityId": "9061afad9c9f5584", "scanner": "scanner-primary", "fingerprint": "fccfcdfba4770a1a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbc530c4f19ddf89", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/email-composer/template-picker.tsx:111"}, "properties": {"repobilityId": "a781900ba58db2e4", "scanner": "scanner-primary", "fingerprint": "bbc530c4f19ddf89", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd161ecc386e7745", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/components/email-composer/template-picker.tsx:128"}, "properties": {"repobilityId": "25494cf63e935b1d", "scanner": "scanner-primary", "fingerprint": "bd161ecc386e7745", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b74c9a116d82fd44", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/components/email-composer/signature-preview.tsx:18"}, "properties": {"repobilityId": "96393b0bf439b03a", "scanner": "scanner-primary", "fingerprint": "b74c9a116d82fd44", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c5a352b276544eeb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/calendar/calendar-navbar-popover.tsx:72"}, "properties": {"repobilityId": "7d8d0a7a2230fe53", "scanner": "scanner-primary", "fingerprint": "c5a352b276544eeb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3c19ba551402ecd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/pricing/pricing-section.tsx:780"}, "properties": {"repobilityId": "da6c33ee4deb7bc9", "scanner": "scanner-primary", "fingerprint": "e3c19ba551402ecd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-659968653f602699", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/settings/email/page.tsx:142"}, "properties": {"repobilityId": "856706b7f279f172", "scanner": "scanner-primary", "fingerprint": "659968653f602699", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7f111e71bdcfbba2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/settings/agency/page.tsx:180"}, "properties": {"repobilityId": "4e572a587f4610b6", "scanner": "scanner-primary", "fingerprint": "7f111e71bdcfbba2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ecddf1ff46e46c1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/settings/cruise-sync/_components/sync-history-table.tsx:142"}, "properties": {"repobilityId": "a4448f13b5e0d33f", "scanner": "scanner-primary", "fingerprint": "ecddf1ff46e46c1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bb2631684a8bef5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/library/payment-schedules/page.tsx:138"}, "properties": {"repobilityId": "d87f138d3f3a57a6", "scanner": "scanner-primary", "fingerprint": "1bb2631684a8bef5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-492489c865a32317", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/tours/_components/tour-detail-modal.tsx:653"}, "properties": {"repobilityId": "402370b269af2a8e", "scanner": "scanner-primary", "fingerprint": "492489c865a32317", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b844b956bac5eab7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/cruises/_components/cruise-card.tsx:104"}, "properties": {"repobilityId": "bd5e68f3eb92d732", "scanner": "scanner-primary", "fingerprint": "b844b956bac5eab7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8bae4f788f783eb7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/cruises/_components/cruise-filters.tsx:449"}, "properties": {"repobilityId": "9e198a8dd45b7a23", "scanner": "scanner-primary", "fingerprint": "8bae4f788f783eb7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8982a18c8923a385", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/cruises/_components/cruise-detail-modal.tsx:410"}, "properties": {"repobilityId": "ff766b691025f1bc", "scanner": "scanner-primary", "fingerprint": "8982a18c8923a385", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6300dcda4aa033c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/vacation/_components/vacation-detail-modal.tsx:271"}, "properties": {"repobilityId": "93204d9cb8e257d2", "scanner": "scanner-primary", "fingerprint": "6300dcda4aa033c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b3eec2dc91b8ef0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/library/vacation/_components/vacation-hotel-card.tsx:118"}, "properties": {"repobilityId": "4f0128e4b86c47fe", "scanner": "scanner-primary", "fingerprint": "4b3eec2dc91b8ef0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab3cd3e493d6213e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/groups/[groupId]/page.tsx:483"}, "properties": {"repobilityId": "0fa9ed537df3f3b2", "scanner": "scanner-primary", "fingerprint": "ab3cd3e493d6213e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6503685f0e46803e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/groups/[groupId]/_components/add-trip-to-group-dialog.tsx:244"}, "properties": {"repobilityId": "9180dae2c7dcdcee", "scanner": "scanner-primary", "fingerprint": "6503685f0e46803e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57a3d1c56a1259e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/import/_components/contact-combobox.tsx:124"}, "properties": {"repobilityId": "e904ddc46a4daa18", "scanner": "scanner-primary", "fingerprint": "57a3d1c56a1259e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-994374690bc85ef7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/import/_components/import-source-form.tsx:293"}, "properties": {"repobilityId": "e76596a6b58b32b5", "scanner": "scanner-primary", "fingerprint": "994374690bc85ef7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d2f6cb5a5081dd7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-comments.tsx:65"}, "properties": {"repobilityId": "934028f92c9ca3ee", "scanner": "scanner-primary", "fingerprint": "5d2f6cb5a5081dd7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-293a1273a29eee67", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/traveler-accordion-item.tsx:377"}, "properties": {"repobilityId": "e4448ee52040c7ed", "scanner": "scanner-primary", "fingerprint": "293a1273a29eee67", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d1f9f9ddcbea56d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/cruise-passengers-section.tsx:70"}, "properties": {"repobilityId": "d0c44c46a3eb77dd", "scanner": "scanner-primary", "fingerprint": "3d1f9f9ddcbea56d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38f3c9cc858bd75c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/contact-search-result.tsx:100"}, "properties": {"repobilityId": "83c0dcb3952c7e2e", "scanner": "scanner-primary", "fingerprint": "38f3c9cc858bd75c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7520c6b02e00f66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-summary-column.tsx:217"}, "properties": {"repobilityId": "11cf8eba83f610ba", "scanner": "scanner-primary", "fingerprint": "c7520c6b02e00f66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-754171ce8d17315f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-overview.tsx:214"}, "properties": {"repobilityId": "693067de0e36e0ee", "scanner": "scanner-primary", "fingerprint": "754171ce8d17315f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01466f693cdeea8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/automation-job-card.tsx:202"}, "properties": {"repobilityId": "e7a80acea63bc0d4", "scanner": "scanner-primary", "fingerprint": "01466f693cdeea8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7081b9b102230156", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/day-column.tsx:226"}, "properties": {"repobilityId": "38c3edf448724f3b", "scanner": "scanner-primary", "fingerprint": "7081b9b102230156", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20bdc8ae23c9227e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/trips/[id]/_components/lodging-form.tsx:93"}, "properties": {"repobilityId": "96cc23f0c9f4495f", "scanner": "scanner-primary", "fingerprint": "20bdc8ae23c9227e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4491df1003f15b3d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-travelers.tsx:146"}, "properties": {"repobilityId": "712d7730f808a698", "scanner": "scanner-primary", "fingerprint": "4491df1003f15b3d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e51e4bc0392b353", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/trip-media-tab.tsx:381"}, "properties": {"repobilityId": "a505e8cc4dad9404", "scanner": "scanner-primary", "fingerprint": "5e51e4bc0392b353", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ce2042edd76a9c5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/trips/[id]/_components/flight-form.tsx:197"}, "properties": {"repobilityId": "d3f55aa7a9c9cb16", "scanner": "scanner-primary", "fingerprint": "6ce2042edd76a9c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-fc6def22abbb163a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/trips/[id]/_components/dining-form.tsx:60"}, "properties": {"repobilityId": "bac20a8b586baeef", "scanner": "scanner-primary", "fingerprint": "fc6def22abbb163a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-13fabc127d41580d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/[id]/_components/payment-schedule-section.tsx:137"}, "properties": {"repobilityId": "a1d355a2c8b8cc54", "scanner": "scanner-primary", "fingerprint": "13fabc127d41580d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-953672c0600489b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/trips/ocr-import/_components/ocr-upload-form.tsx:142"}, "properties": {"repobilityId": "33115d8f18f73472", "scanner": "scanner-primary", "fingerprint": "953672c0600489b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13835a067debe2f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/reporting/_components/report-view.tsx:255"}, "properties": {"repobilityId": "050682837875a2a7", "scanner": "scanner-primary", "fingerprint": "13835a067debe2f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-911a6d6cbacd2244", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/trip-card.tsx:38"}, "properties": {"repobilityId": "e901b1a85cb5dc30", "scanner": "scanner-primary", "fingerprint": "911a6d6cbacd2244", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbcf8085c031fac9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/tasks-due-widget.tsx:52"}, "properties": {"repobilityId": "5737bab40aa68547", "scanner": "scanner-primary", "fingerprint": "cbcf8085c031fac9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f600a084e9243bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/payments-due-widget.tsx:46"}, "properties": {"repobilityId": "f94b0e40f667072f", "scanner": "scanner-primary", "fingerprint": "8f600a084e9243bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d07742a29dd4446", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/sidebar-recent-emails.tsx:130"}, "properties": {"repobilityId": "fd2d8eba1283adc7", "scanner": "scanner-primary", "fingerprint": "6d07742a29dd4446", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f4749c3d7f837f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/dashboard/_components/sidebar-agent-leaderboard.tsx:48"}, "properties": {"repobilityId": "5cc09ef4e4097110", "scanner": "scanner-primary", "fingerprint": "8f4749c3d7f837f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f6dee25444951a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/emails/inbox/page.tsx:380"}, "properties": {"repobilityId": "fedbca94cf31b2fc", "scanner": "scanner-primary", "fingerprint": "9f6dee25444951a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-804a93f9feef6396", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/emails/inbox/_components/folder-sidebar.tsx:410"}, "properties": {"repobilityId": "d8545cbcc58ba457", "scanner": "scanner-primary", "fingerprint": "804a93f9feef6396", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f379d91775a17512", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/emails/inbox/_components/email-reader.tsx:353"}, "properties": {"repobilityId": "037e97f0d4c3a681", "scanner": "scanner-primary", "fingerprint": "f379d91775a17512", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50f5c10ad6efdd92", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/emails/inbox/_components/email-reader.tsx:319"}, "properties": {"repobilityId": "5506ad2755891433", "scanner": "scanner-primary", "fingerprint": "50f5c10ad6efdd92", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-186ff6639848618e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/page.tsx:1679"}, "properties": {"repobilityId": "f699f9e096d99868", "scanner": "scanner-primary", "fingerprint": "186ff6639848618e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-11a12bc72bd7a892", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/contact-emails-section.tsx:293"}, "properties": {"repobilityId": "d2aecadf2b009297", "scanner": "scanner-primary", "fingerprint": "11a12bc72bd7a892", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e6dba51be70b5304", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/relationships-card.tsx:117"}, "properties": {"repobilityId": "b52c8f1c9a09a75a", "scanner": "scanner-primary", "fingerprint": "e6dba51be70b5304", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f024a5384b921a4c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/recent-emails-card.tsx:156"}, "properties": {"repobilityId": "6d3bb14b978307bc", "scanner": "scanner-primary", "fingerprint": "f024a5384b921a4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb6ce429ee7d1e14", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/contacts/[id]/_components/email-preview-dialog.tsx:124"}, "properties": {"repobilityId": "a1463e7e8fd98c7b", "scanner": "scanner-primary", "fingerprint": "bb6ce429ee7d1e14", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-cd492a497d5bc778", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/relationships-section.tsx:138"}, "properties": {"repobilityId": "fe8136476751a8c7", "scanner": "scanner-primary", "fingerprint": "cd492a497d5bc778", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1d3acd9d966f518", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/[id]/_components/loyalty-programs-section.tsx:119"}, "properties": {"repobilityId": "f9171b9fcc04763b", "scanner": "scanner-primary", "fingerprint": "d1d3acd9d966f518", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-66b8a8246c89354e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/merge-editor-dialog.tsx:224"}, "properties": {"repobilityId": "55a0bf9360d908a0", "scanner": "scanner-primary", "fingerprint": "66b8a8246c89354e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0dfbe1b9a47ed30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/contacts-table.tsx:320"}, "properties": {"repobilityId": "4b7583147f0c15af", "scanner": "scanner-primary", "fingerprint": "f0dfbe1b9a47ed30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d35f9dfec17107b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/contact-kanban-card.tsx:52"}, "properties": {"repobilityId": "3ee82038e51e9b2d", "scanner": "scanner-primary", "fingerprint": "6d35f9dfec17107b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-44dad624ed3c881a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/contact-import-wizard.tsx:331"}, "properties": {"repobilityId": "87b19986266cd047", "scanner": "scanner-primary", "fingerprint": "44dad624ed3c881a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9392cb51e3acbc2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/_components/tag-assign-popover.tsx:178"}, "properties": {"repobilityId": "536ef0d2079edabd", "scanner": "scanner-primary", "fingerprint": "9392cb51e3acbc2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee4289d2b6f65f7f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/contacts/duplicates/_components/duplicate-group-card.tsx:59"}, "properties": {"repobilityId": "1491df302b8cc0e2", "scanner": "scanner-primary", "fingerprint": "ee4289d2b6f65f7f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-498762e02426241e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/profile/_components/email-setup-wizard.tsx:332"}, "properties": {"repobilityId": "c135320a0cf28c37", "scanner": "scanner-primary", "fingerprint": "498762e02426241e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-93f5e4b04e7f285d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/profile/_components/email-tab.tsx:454"}, "properties": {"repobilityId": "630eb59fc4e73493", "scanner": "scanner-primary", "fingerprint": "93f5e4b04e7f285d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b3bc2f6b6e4827d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/trips/[tripId]/page.tsx:117"}, "properties": {"repobilityId": "41f68932970a491c", "scanner": "scanner-primary", "fingerprint": "b3bc2f6b6e4827d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae52e208cbc92df0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/commission/disbursements/[id]/_components/account-details-dialog.tsx:12"}, "properties": {"repobilityId": "8bf9b71035d32a00", "scanner": "scanner-primary", "fingerprint": "ae52e208cbc92df0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-43562f5b55aa7931", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/disbursements/d/[id]/page.tsx:283"}, "properties": {"repobilityId": "479ba90750214468", "scanner": "scanner-primary", "fingerprint": "43562f5b55aa7931", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2c212d04d5f390e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/deposit-builder.tsx:294"}, "properties": {"repobilityId": "a978601018c65050", "scanner": "scanner-primary", "fingerprint": "b2c212d04d5f390e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06f6604882d79cb8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/pending-receivables-table.tsx:350"}, "properties": {"repobilityId": "5649fa5bfbd8d7a6", "scanner": "scanner-primary", "fingerprint": "06f6604882d79cb8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84aa900642d6bb8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/adjustment-dialog.tsx:103"}, "properties": {"repobilityId": "148eed8156278a53", "scanner": "scanner-primary", "fingerprint": "84aa900642d6bb8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65fcc9e91eee0701", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/receive/_components/match-item-dialog.tsx:158"}, "properties": {"repobilityId": "ad1b108972d93fad", "scanner": "scanner-primary", "fingerprint": "65fcc9e91eee0701", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd950cc44bbcd924", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/_components/agent-adjustments-dialog.tsx:176"}, "properties": {"repobilityId": "1ea838f1969773d4", "scanner": "scanner-primary", "fingerprint": "fd950cc44bbcd924", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5190eac57c2a14c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/commission/_components/claim-builder.tsx:374"}, "properties": {"repobilityId": "f9dbc2064c68f1e9", "scanner": "scanner-primary", "fingerprint": "5190eac57c2a14c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c7085ff5b73c48a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/calendar/_components/calendar-month-view.tsx:295"}, "properties": {"repobilityId": "ee4ff9743b6a6839", "scanner": "scanner-primary", "fingerprint": "1c7085ff5b73c48a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f3d6df77b79b610", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/hooks/use-mfa.ts:214"}, "properties": {"repobilityId": "b66fc4be651e4be6", "scanner": "scanner-primary", "fingerprint": "2f3d6df77b79b610", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b685ffb815461ab6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/context/loading-context.tsx:276"}, "properties": {"repobilityId": "2aee4a7f81e71b21", "scanner": "scanner-primary", "fingerprint": "b685ffb815461ab6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4153524e5c678a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/ai/ai-contextual-prompt.tsx:47"}, "properties": {"repobilityId": "9ec0921feaa9fd32", "scanner": "scanner-primary", "fingerprint": "e4153524e5c678a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-befa75b38a554310", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/hub/sections/destinations-section.tsx:25"}, "properties": {"repobilityId": "a7530b4dbcf7827e", "scanner": "scanner-primary", "fingerprint": "befa75b38a554310", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-393e8c8e6714ad8f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/hub/sections/nearby-section.tsx:42"}, "properties": {"repobilityId": "145b35eb6501fd5e", "scanner": "scanner-primary", "fingerprint": "393e8c8e6714ad8f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a446d246c0ac1e85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/flights/flight-filters.tsx:196"}, "properties": {"repobilityId": "1a1f404e349272cc", "scanner": "scanner-primary", "fingerprint": "a446d246c0ac1e85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-635e8b0c83641b2f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/ota/src/components/flights/flight-search-client.tsx:256"}, "properties": {"repobilityId": "d53c3a23af047c45", "scanner": "scanner-primary", "fingerprint": "635e8b0c83641b2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bb36af24ba16b1f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/search/airport-autocomplete.tsx:140"}, "properties": {"repobilityId": "9237097efce8a8f1", "scanner": "scanner-primary", "fingerprint": "bb36af24ba16b1f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8525047c8bf360b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cruise-lines/cruise-line-card.tsx:20"}, "properties": {"repobilityId": "7e99745e6478a7f0", "scanner": "scanner-primary", "fingerprint": "8525047c8bf360b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-768fac1803d3ae3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/activity-product-card.tsx:93"}, "properties": {"repobilityId": "7c501a52fefcbb8d", "scanner": "scanner-primary", "fingerprint": "768fac1803d3ae3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61d69c6eb623b59e", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/activity-product-card.tsx:34"}, "properties": {"repobilityId": "35c967c40b72291d", "scanner": "scanner-primary", "fingerprint": "61d69c6eb623b59e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-1fbdba3aaab6f31e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/hotel-product-card.tsx:109"}, "properties": {"repobilityId": "5ef19186ccb7a586", "scanner": "scanner-primary", "fingerprint": "1fbdba3aaab6f31e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2facd8385a752c6a", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/hotel-product-card.tsx:40"}, "properties": {"repobilityId": "f2f7f4ecfaf3d045", "scanner": "scanner-primary", "fingerprint": "2facd8385a752c6a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-3daef88d2476ca97", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/promotion-card.tsx:106"}, "properties": {"repobilityId": "9abd43d6add03ed8", "scanner": "scanner-primary", "fingerprint": "3daef88d2476ca97", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1d7cf1dc887e1c1", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/promotion-card.tsx:36"}, "properties": {"repobilityId": "51656aa36f7df0a4", "scanner": "scanner-primary", "fingerprint": "a1d7cf1dc887e1c1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-ac5582a9b5765501", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/cruise-product-card.tsx:94"}, "properties": {"repobilityId": "6274e37ef0dfe49a", "scanner": "scanner-primary", "fingerprint": "ac5582a9b5765501", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93dc54b89c04d8ac", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/cruise-product-card.tsx:35"}, "properties": {"repobilityId": "1d56347e3a191f06", "scanner": "scanner-primary", "fingerprint": "93dc54b89c04d8ac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-f12a0aad86c701e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/flight-product-card.tsx:282"}, "properties": {"repobilityId": "65148106f4c9fb64", "scanner": "scanner-primary", "fingerprint": "f12a0aad86c701e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9eb6ca6d7530e314", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/flight-product-card.tsx:96"}, "properties": {"repobilityId": "af1c12546a40cf8f", "scanner": "scanner-primary", "fingerprint": "9eb6ca6d7530e314", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-442a0400f9ccaec7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/cards/tour-product-card.tsx:101"}, "properties": {"repobilityId": "79bf3cfa4b4f927f", "scanner": "scanner-primary", "fingerprint": "442a0400f9ccaec7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-377aedc79979fb1c", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 apps/ota/src/components/cards/tour-product-card.tsx:37"}, "properties": {"repobilityId": "7b69a2147146bafd", "scanner": "scanner-primary", "fingerprint": "377aedc79979fb1c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-250e87fd4146a75f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/ships/ship-card.tsx:38"}, "properties": {"repobilityId": "7fcfcfe1f0eb8451", "scanner": "scanner-primary", "fingerprint": "250e87fd4146a75f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-327a1757c94f1552", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/trip-builder/trip-picker-dropdown.tsx:52"}, "properties": {"repobilityId": "14b4bf5c3ab82fdf", "scanner": "scanner-primary", "fingerprint": "327a1757c94f1552", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4c310fe1f0323ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/trip-builder/ai-suggestion-card.tsx:37"}, "properties": {"repobilityId": "19ad71cb12382a1c", "scanner": "scanner-primary", "fingerprint": "e4c310fe1f0323ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1678bee5ccef85f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/deals/deal-quick-facts.tsx:88"}, "properties": {"repobilityId": "d15a997f1c7cbafb", "scanner": "scanner-primary", "fingerprint": "1678bee5ccef85f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ab832a3f2bd4993", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ota/src/components/advisor/advisor-context-bar.tsx:49"}, "properties": {"repobilityId": "49fb73cf0bbe876a", "scanner": "scanner-primary", "fingerprint": "8ab832a3f2bd4993", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1daa3f8ce7c474d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/ota/src/app/layout.tsx:68"}, "properties": {"repobilityId": "2d1b5ed3583fbe68", "scanner": "scanner-primary", "fingerprint": "e1daa3f8ce7c474d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a5a155605592e712", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/ota/src/app/api/chat/route.ts:130"}, "properties": {"repobilityId": "15b6827c85fe4c42", "scanner": "scanner-primary", "fingerprint": "a5a155605592e712", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d7aa3459eeeaff83", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/resolve-destination-airports.ts:75"}, "properties": {"repobilityId": "05b7c908f3e90808", "scanner": "scanner-primary", "fingerprint": "d7aa3459eeeaff83", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1829b2e8e4083a50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/fix-851-unarchive-planning-itineraries.ts:61"}, "properties": {"repobilityId": "9f150a6c563aa344", "scanner": "scanner-primary", "fingerprint": "1829b2e8e4083a50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a8e8f72badbf9f0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-group-subtrip-payments.ts:230"}, "properties": {"repobilityId": "d4ab3400b54d24ed", "scanner": "scanner-primary", "fingerprint": "2a8e8f72badbf9f0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ab4c02c931fc8acf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/import-group-bookings.ts:79"}, "properties": {"repobilityId": "7a0815e1d1d9dfd7", "scanner": "scanner-primary", "fingerprint": "ab4c02c931fc8acf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-23cef2fef365d1fd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/heal-issue844-insurance-premium.ts:67"}, "properties": {"repobilityId": "3a938cf8858735c7", "scanner": "scanner-primary", "fingerprint": "23cef2fef365d1fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cc1794b4b45a508a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/verify-historical-payout-disjoint.ts:124"}, "properties": {"repobilityId": "af2459ca91af7507", "scanner": "scanner-primary", "fingerprint": "cc1794b4b45a508a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c2392ce0cd1bbbc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/validate-import.ts:71"}, "properties": {"repobilityId": "94e8238ab9e67b27", "scanner": "scanner-primary", "fingerprint": "9c2392ce0cd1bbbc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-99671fded7cc5437", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/precut3-exposure-report.ts:147"}, "properties": {"repobilityId": "cd49bf598a0b5f2e", "scanner": "scanner-primary", "fingerprint": "99671fded7cc5437", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-802f0f1e034a4a5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-issue915-default-schedule.ts:59"}, "properties": {"repobilityId": "c183f3f96b5c7981", "scanner": "scanner-primary", "fingerprint": "802f0f1e034a4a5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2b0096202340afdf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/ingest-payroll-csv.ts:253"}, "properties": {"repobilityId": "bdf5fd7dc0450b6b", "scanner": "scanner-primary", "fingerprint": "2b0096202340afdf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-724bfe4df8dd0a57", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/audit-issue915-missing-schedule.ts:37"}, "properties": {"repobilityId": "f5d5ea3ff7056fa8", "scanner": "scanner-primary", "fingerprint": "724bfe4df8dd0a57", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f5e98afe38f19de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/extract-travelesolutions.ts:30"}, "properties": {"repobilityId": "43d60ec90ad2b73c", "scanner": "scanner-primary", "fingerprint": "2f5e98afe38f19de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb7618627919224e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/supplier-dedup.ts:423"}, "properties": {"repobilityId": "8058a676b3dd1163", "scanner": "scanner-primary", "fingerprint": "bb7618627919224e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-56bf7dca7b0652ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/resync-commission-tracking-372e41a5.ts:64"}, "properties": {"repobilityId": "534738f5b9751fc3", "scanner": "scanner-primary", "fingerprint": "56bf7dca7b0652ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68fc63021196e310", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/verify-commission-mapping.ts:74"}, "properties": {"repobilityId": "d24e3ca25f0f34ff", "scanner": "scanner-primary", "fingerprint": "68fc63021196e310", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6dd413392fda5042", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/resync-commission-tracking-clean.ts:88"}, "properties": {"repobilityId": "1f2f25b26fd71f17", "scanner": "scanner-primary", "fingerprint": "6dd413392fda5042", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f10993ec21877651", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/ingest-ic-historical-invoices.ts:152"}, "properties": {"repobilityId": "1ab3911a0bf9c140", "scanner": "scanner-primary", "fingerprint": "f10993ec21877651", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f4e87e49ba39dcac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/import-to-tailfire.ts:70"}, "properties": {"repobilityId": "c41b5b8dc5e754c3", "scanner": "scanner-primary", "fingerprint": "f4e87e49ba39dcac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c0f32047f2abfbb2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-issue834-payments.ts:340"}, "properties": {"repobilityId": "de5dcd67018147e4", "scanner": "scanner-primary", "fingerprint": "c0f32047f2abfbb2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-01c21f3a9c049cf4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/provision-ic-onboarding.ts:58"}, "properties": {"repobilityId": "3ed087d388c3efd3", "scanner": "scanner-primary", "fingerprint": "01c21f3a9c049cf4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f81ea1b504af8ee8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/unwind-historical-ic-ingest.ts:60"}, "properties": {"repobilityId": "d33457213d25fab6", "scanner": "scanner-primary", "fingerprint": "f81ea1b504af8ee8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ae80739573125c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-flight-legs.ts:77"}, "properties": {"repobilityId": "e7c858068640c126", "scanner": "scanner-primary", "fingerprint": "2ae80739573125c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d63a645f1bf2620", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/purge-collaborator.ts:37"}, "properties": {"repobilityId": "7085e953be58336d", "scanner": "scanner-primary", "fingerprint": "7d63a645f1bf2620", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e77ca5925bd2a6e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/backfill-group-subtrip-travelers.ts:138"}, "properties": {"repobilityId": "c5b03c569824f6d8", "scanner": "scanner-primary", "fingerprint": "e77ca5925bd2a6e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-edd8c36560ddb49d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/provision-advisors-from-csv.ts:82"}, "properties": {"repobilityId": "8669f7662e313ae4", "scanner": "scanner-primary", "fingerprint": "edd8c36560ddb49d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-893174671892384c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/waive-historical-platform-fees.ts:95"}, "properties": {"repobilityId": "5e93d76416ad60a9", "scanner": "scanner-primary", "fingerprint": "893174671892384c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bfc019b8a579b4c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migration/precut-5-provision-prod-agents.ts:170"}, "properties": {"repobilityId": "a30af63389bb6287", "scanner": "scanner-primary", "fingerprint": "bfc019b8a579b4c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36c72e57fbb8f917", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analysis/phase5-ic-payout-worklist.ts:185"}, "properties": {"repobilityId": "e47c94133532bbea", "scanner": "scanner-primary", "fingerprint": "36c72e57fbb8f917", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3c1a61eae93c64ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/e2e/flight-scenarios-e2e.ts:326"}, "properties": {"repobilityId": "69d19e5070b450dd", "scanner": "scanner-primary", "fingerprint": "3c1a61eae93c64ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-012da430a0a70a8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/profile.ts:18"}, "properties": {"repobilityId": "536c8fc6450b39a3", "scanner": "scanner-primary", "fingerprint": "012da430a0a70a8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-51ce733d9a3cab62", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/inquiries.ts:15"}, "properties": {"repobilityId": "3435f241868b8839", "scanner": "scanner-primary", "fingerprint": "51ce733d9a3cab62", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0226477c3c4d6fb4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/client.ts:86"}, "properties": {"repobilityId": "4ed2f87f3be6d029", "scanner": "scanner-primary", "fingerprint": "0226477c3c4d6fb4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1ff665a7f54be23a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/api-client/src/tracking.ts:15"}, "properties": {"repobilityId": "c210605f60bea530", "scanner": "scanner-primary", "fingerprint": "1ff665a7f54be23a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a85eb1f5c7d54466", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/scripts/replay-from-blank.ts:153"}, "properties": {"repobilityId": "8653d7bf901adf05", "scanner": "scanner-primary", "fingerprint": "a85eb1f5c7d54466", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09fdecd76784c780", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/scripts/validate-migrations.ts:154"}, "properties": {"repobilityId": "f2a99bd0d2567ee6", "scanner": "scanner-primary", "fingerprint": "09fdecd76784c780", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cedb6353dce37c68", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/src/seed.ts:17"}, "properties": {"repobilityId": "7f636c96ab38b907", "scanner": "scanner-primary", "fingerprint": "cedb6353dce37c68", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-db2f89f18f9324cf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/src/reset.ts:24"}, "properties": {"repobilityId": "5fa256e1cc657b50", "scanner": "scanner-primary", "fingerprint": "db2f89f18f9324cf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d9c73ccc8fa8a89", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/src/migrate.ts:62"}, "properties": {"repobilityId": "92272bbaacf66351", "scanner": "scanner-primary", "fingerprint": "9d9c73ccc8fa8a89", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-568011b3bb7ae88a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/src/seeds/cruise-data-seed.ts:50"}, "properties": {"repobilityId": "535d75b132748e18", "scanner": "scanner-primary", "fingerprint": "568011b3bb7ae88a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-98cd683917eecf8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/trip-proposal-ui/src/components/ActivityCard.tsx:67"}, "properties": {"repobilityId": "275dedaf0a2c9116", "scanner": "scanner-primary", "fingerprint": "98cd683917eecf8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72bcea45c3934d1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/trip-proposal-ui/src/components/SideBySideComparison.tsx:69"}, "properties": {"repobilityId": "bc10d91a7b1ee66f", "scanner": "scanner-primary", "fingerprint": "72bcea45c3934d1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bf0da1580488a22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/trip-proposal-ui/src/components/details/FlightDetail.tsx:187"}, "properties": {"repobilityId": "a210b17073ba147f", "scanner": "scanner-primary", "fingerprint": "1bf0da1580488a22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d81db2210f49f27a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/ui-public/src/components/ui/chart.tsx:72"}, "properties": {"repobilityId": "87928d3ccab451f8", "scanner": "scanner-primary", "fingerprint": "d81db2210f49f27a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-eaa0555c642c40e0", "level": "warning", "message": {"text": "Privileged port 2 in use"}, "properties": {"repobilityId": "755b04866010e843", "scanner": "scanner-primary", "fingerprint": "eaa0555c642c40e0", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/data-corrections/736-retype-5-mistyped-insurance-activities.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-34ecf40daf02a675", "level": "warning", "message": {"text": "Privileged port 54 in use"}, "properties": {"repobilityId": "cfa860c24fdc3eef", "scanner": "scanner-primary", "fingerprint": "34ecf40daf02a675", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/data-corrections/736-retype-5-mistyped-insurance-activities.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ef22e2cd62db15ae", "level": "warning", "message": {"text": "Privileged port 55 in use"}, "properties": {"repobilityId": "51a768b3e1831ac0", "scanner": "scanner-primary", "fingerprint": "ef22e2cd62db15ae", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/data-corrections/736-retype-5-mistyped-insurance-activities.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-a35c6a00f751880f", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "properties": {"repobilityId": "97b67ca54c60833e", "scanner": "scanner-primary", "fingerprint": "a35c6a00f751880f", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-eafa8856b311c118", "level": "error", "message": {"text": "Possible secret in apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "properties": {"repobilityId": "5e4506726055f307", "scanner": "scanner-primary", "fingerprint": "eafa8856b311c118", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-eafa8856b311c118", "level": "error", "message": {"text": "Possible secret in apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "properties": {"repobilityId": "5e4506726055f307", "scanner": "scanner-primary", "fingerprint": "eafa8856b311c118", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "region": {"startLine": 126}}}]}, {"ruleId": "scanner-eafa8856b311c118", "level": "error", "message": {"text": "Possible secret in apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "properties": {"repobilityId": "5e4506726055f307", "scanner": "scanner-primary", "fingerprint": "eafa8856b311c118", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "region": {"startLine": 250}}}]}, {"ruleId": "scanner-eafa8856b311c118", "level": "error", "message": {"text": "Possible secret in apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "properties": {"repobilityId": "5e4506726055f307", "scanner": "scanner-primary", "fingerprint": "eafa8856b311c118", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "region": {"startLine": 501}}}]}, {"ruleId": "scanner-eafa8856b311c118", "level": "error", "message": {"text": "Possible secret in apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "properties": {"repobilityId": "5e4506726055f307", "scanner": "scanner-primary", "fingerprint": "eafa8856b311c118", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/activity-logs/audit-sanitizer.spec.ts"}, "region": {"startLine": 506}}}]}, {"ruleId": "scanner-e7162e00bbc25975", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in apps/api/src/cruise-import/README.md:11"}, "properties": {"repobilityId": "1851666174e4f3c1", "scanner": "scanner-primary", "fingerprint": "e7162e00bbc25975", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/cruise-import/README.md"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-bc545ed272cc08a9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/playwright-report/index.html:58"}, "properties": {"repobilityId": "aa2e2325dc12f1cb", "scanner": "scanner-primary", "fingerprint": "bc545ed272cc08a9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/playwright-report/index.html"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-feb1e9807561b119", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/playwright-report/index.html:57"}, "properties": {"repobilityId": "bd4bb72826d3ba85", "scanner": "scanner-primary", "fingerprint": "feb1e9807561b119", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/playwright-report/index.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-d664528e85129136", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/components/email-composer/signature-preview.tsx:18"}, "properties": {"repobilityId": "1ca20560df85b20b", "scanner": "scanner-primary", "fingerprint": "d664528e85129136", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/components/email-composer/signature-preview.tsx"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-21515ba914a12b3a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/settings/email/page.tsx:142"}, "properties": {"repobilityId": "33961b017f8bcb7d", "scanner": "scanner-primary", "fingerprint": "21515ba914a12b3a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/settings/email/page.tsx"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-e87471a5d4df4b77", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/auth/callback/route.ts:203"}, "properties": {"repobilityId": "60995ecb36e118bc", "scanner": "scanner-primary", "fingerprint": "e87471a5d4df4b77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/auth/callback/route.ts"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-f471cd0dd4e0ac44", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in apps/admin/src/app/trips/[id]/_components/tour-form.tsx:549"}, "properties": {"repobilityId": "5f8be61d3a79dc16", "scanner": "scanner-primary", "fingerprint": "f471cd0dd4e0ac44", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/trips/[id]/_components/tour-form.tsx"}, "region": {"startLine": 549}}}]}, {"ruleId": "scanner-c5176c237c10e04e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/emails/inbox/_components/email-reader.tsx:319"}, "properties": {"repobilityId": "1c0f9d0aeb22ee0c", "scanner": "scanner-primary", "fingerprint": "c5176c237c10e04e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/emails/inbox/_components/email-reader.tsx"}, "region": {"startLine": 319}}}]}, {"ruleId": "scanner-ea2dc28afd9264ee", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/contacts/[id]/_components/email-preview-dialog.tsx:124"}, "properties": {"repobilityId": "20f6024a714cbdd1", "scanner": "scanner-primary", "fingerprint": "ea2dc28afd9264ee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/contacts/[id]/_components/email-preview-dialog.tsx"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-5c429b43ad1e7a77", "level": "note", "message": {"text": "Insecure pattern 'document_write' in apps/admin/src/app/contacts/_components/contact-print-report.ts:73"}, "properties": {"repobilityId": "2c2367a070e50b43", "scanner": "scanner-primary", "fingerprint": "5c429b43ad1e7a77", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/contacts/_components/contact-print-report.ts"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-8474c287680343d1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/profile/_components/email-setup-wizard.tsx:332"}, "properties": {"repobilityId": "5a323b329d162cde", "scanner": "scanner-primary", "fingerprint": "8474c287680343d1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/profile/_components/email-setup-wizard.tsx"}, "region": {"startLine": 332}}}]}, {"ruleId": "scanner-7908a077f22039e7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/profile/_components/email-tab.tsx:454"}, "properties": {"repobilityId": "b8b9737a3c6b3b8c", "scanner": "scanner-primary", "fingerprint": "7908a077f22039e7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/profile/_components/email-tab.tsx"}, "region": {"startLine": 454}}}]}, {"ruleId": "scanner-2993ecac31965cbe", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in apps/admin/src/lib/sanitize-email-html.ts:36"}, "properties": {"repobilityId": "23c2679ed96da171", "scanner": "scanner-primary", "fingerprint": "2993ecac31965cbe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/lib/sanitize-email-html.ts"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-2c0390de2e5fa72c", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in apps/ota/src/stores/travel-session-store.ts:21"}, "properties": {"repobilityId": "5bbaadb293661947", "scanner": "scanner-primary", "fingerprint": "2c0390de2e5fa72c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ota/src/stores/travel-session-store.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-54029cd62e014fa2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/ota/src/app/layout.tsx:68"}, "properties": {"repobilityId": "2c90f478811e73a5", "scanner": "scanner-primary", "fingerprint": "54029cd62e014fa2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ota/src/app/layout.tsx"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-fb5ccdb05f5adba4", "level": "error", "message": {"text": "Possible secret in scripts/setup-local-fdw.sh"}, "properties": {"repobilityId": "0ce904a6c2405fc4", "scanner": "scanner-primary", "fingerprint": "fb5ccdb05f5adba4", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup-local-fdw.sh"}, "region": {"startLine": 96}}}]}, {"ruleId": "scanner-8fdc5b383c694c86", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/run-next.mjs:1"}, "properties": {"repobilityId": "4e990faac9ac4f40", "scanner": "scanner-primary", "fingerprint": "8fdc5b383c694c86", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/run-next.mjs"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8b96a535ae23413f", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in scripts/demo/lib/backup.ts:13"}, "properties": {"repobilityId": "5f50bf733a8ea3d9", "scanner": "scanner-primary", "fingerprint": "8b96a535ae23413f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/demo/lib/backup.ts"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-885e43eb49456373", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/demo/lib/backup.ts:1"}, "properties": {"repobilityId": "f29101899f221dc2", "scanner": "scanner-primary", "fingerprint": "885e43eb49456373", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/demo/lib/backup.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ed49e4ca4e9c912e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/migration/verify-commission-mapping.ts:25"}, "properties": {"repobilityId": "0a6598554d56bf75", "scanner": "scanner-primary", "fingerprint": "ed49e4ca4e9c912e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/migration/verify-commission-mapping.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-0ec1378721f158f6", "level": "error", "message": {"text": "Possible secret in scripts/migration/tes-import-runner.sh"}, "properties": {"repobilityId": "5963afc8b0498f4c", "scanner": "scanner-primary", "fingerprint": "0ec1378721f158f6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/migration/tes-import-runner.sh"}, "region": {"startLine": 256}}}]}, {"ruleId": "scanner-7399a058f49f3bf3", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/ui-public/src/components/ui/chart.tsx:72"}, "properties": {"repobilityId": "dc03bcdde968a726", "scanner": "scanner-primary", "fingerprint": "7399a058f49f3bf3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ui-public/src/components/ui/chart.tsx"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d6aaf2bc5679c59f", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2f7b4639e57ee169", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1555e994cbc8ae94", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d6aaf2bc5679c59f", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d6aaf2bc5679c59f", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 199}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d6aaf2bc5679c59f", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 225}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d6aaf2bc5679c59f", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 251}}}]}, {"ruleId": "scanner-36fd3c86ff87e5ff", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a273d85b849cb15", "scanner": "scanner-primary", "fingerprint": "36fd3c86ff87e5ff", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-staging.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-36fd3c86ff87e5ff", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f4a2db50cfff9759", "scanner": "scanner-primary", "fingerprint": "36fd3c86ff87e5ff", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-staging.yml"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-36fd3c86ff87e5ff", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0ea945589fbed9a2", "scanner": "scanner-primary", "fingerprint": "36fd3c86ff87e5ff", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-staging.yml"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-36fd3c86ff87e5ff", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a273d85b849cb15", "scanner": "scanner-primary", "fingerprint": "36fd3c86ff87e5ff", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-staging.yml"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-36fd3c86ff87e5ff", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a273d85b849cb15", "scanner": "scanner-primary", "fingerprint": "36fd3c86ff87e5ff", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-staging.yml"}, "region": {"startLine": 191}}}]}, {"ruleId": "scanner-36fd3c86ff87e5ff", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a273d85b849cb15", "scanner": "scanner-primary", "fingerprint": "36fd3c86ff87e5ff", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-staging.yml"}, "region": {"startLine": 226}}}]}, {"ruleId": "scanner-36fd3c86ff87e5ff", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a273d85b849cb15", "scanner": "scanner-primary", "fingerprint": "36fd3c86ff87e5ff", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-staging.yml"}, "region": {"startLine": 252}}}]}, {"ruleId": "scanner-1d7b03e0a59e2187", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "792324b230159024", "scanner": "scanner-primary", "fingerprint": "1d7b03e0a59e2187", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/migration-parity.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-1d7b03e0a59e2187", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7709635e520a6973", "scanner": "scanner-primary", "fingerprint": "1d7b03e0a59e2187", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/migration-parity.yml"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-fc9b546ea9419ede", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e353c97b41ba9b17", "scanner": "scanner-primary", "fingerprint": "fc9b546ea9419ede", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-preview.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-fc9b546ea9419ede", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3fdaa7e3d08d6ff7", "scanner": "scanner-primary", "fingerprint": "fc9b546ea9419ede", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-preview.yml"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-fc9b546ea9419ede", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "670b4cb7006afe70", "scanner": "scanner-primary", "fingerprint": "fc9b546ea9419ede", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-preview.yml"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-fc9b546ea9419ede", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e353c97b41ba9b17", "scanner": "scanner-primary", "fingerprint": "fc9b546ea9419ede", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-preview.yml"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-fc9b546ea9419ede", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e353c97b41ba9b17", "scanner": "scanner-primary", "fingerprint": "fc9b546ea9419ede", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-preview.yml"}, "region": {"startLine": 186}}}]}, {"ruleId": "scanner-fc9b546ea9419ede", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e353c97b41ba9b17", "scanner": "scanner-primary", "fingerprint": "fc9b546ea9419ede", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-preview.yml"}, "region": {"startLine": 221}}}]}, {"ruleId": "scanner-fc9b546ea9419ede", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e353c97b41ba9b17", "scanner": "scanner-primary", "fingerprint": "fc9b546ea9419ede", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-preview.yml"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-548309a3a5a17d98", "level": "note", "message": {"text": "Very large file: apps/api/src/financials/trip-order.service.ts (2086 lines)"}, "properties": {"repobilityId": "11f11ebd4ae4c3b3", "scanner": "scanner-primary", "fingerprint": "548309a3a5a17d98", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-49e9c35e64028639", "level": "note", "message": {"text": "Very large file: apps/api/src/financials/commission/commission.service.ts (4263 lines)"}, "properties": {"repobilityId": "cd67303590684a70", "scanner": "scanner-primary", "fingerprint": "49e9c35e64028639", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ebe9015e4581bb09", "level": "note", "message": {"text": "Very large file: apps/api/src/financials/commission/commission-reports.service.ts (1668 lines)"}, "properties": {"repobilityId": "f6897d919b061fb2", "scanner": "scanner-primary", "fingerprint": "ebe9015e4581bb09", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f529ec698f163470", "level": "note", "message": {"text": "Very large file: apps/api/src/trips/activities.service.ts (3558 lines)"}, "properties": {"repobilityId": "7183aa55c8d3103e", "scanner": "scanner-primary", "fingerprint": "f529ec698f163470", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-252ace1ce6f18d03", "level": "note", "message": {"text": "Very large file: apps/api/src/trips/payment-schedules.service.ts (2977 lines)"}, "properties": {"repobilityId": "fc63d63e42fba6fc", "scanner": "scanner-primary", "fingerprint": "252ace1ce6f18d03", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5291e344f45dd206", "level": "note", "message": {"text": "Very large file: apps/api/src/trips/component-orchestration.service.ts (4265 lines)"}, "properties": {"repobilityId": "d8ae8ae5ac818616", "scanner": "scanner-primary", "fingerprint": "5291e344f45dd206", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c7ea8cd703b43940", "level": "note", "message": {"text": "Very large file: apps/api/src/trips/trips.service.ts (7616 lines)"}, "properties": {"repobilityId": "1bbbe59b70215e5d", "scanner": "scanner-primary", "fingerprint": "c7ea8cd703b43940", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f1dab515e7d91f1e", "level": "note", "message": {"text": "Very large file: apps/api/src/ic-payouts/backfill/ic-backfill.service.ts (1092 lines)"}, "properties": {"repobilityId": "18e11bb46f780286", "scanner": "scanner-primary", "fingerprint": "f1dab515e7d91f1e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3c3d1e9dfb26c71d", "level": "note", "message": {"text": "Very large file: apps/api/src/ic-payouts/invoices/ic-invoice.service.ts (1527 lines)"}, "properties": {"repobilityId": "5bf94a2ac9902c18", "scanner": "scanner-primary", "fingerprint": "3c3d1e9dfb26c71d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1af1bc5b021e085c", "level": "note", "message": {"text": "Very large file: apps/api/src/ic-payouts/invoices/__tests__/ic-invoice.service.spec.ts (1446 lines)"}, "properties": {"repobilityId": "3002aa659bd4eb3b", "scanner": "scanner-primary", "fingerprint": "1af1bc5b021e085c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6123837a71620c20", "level": "note", "message": {"text": "Very large file: apps/api/src/cruise-booking/services/import-booking.service.ts (2375 lines)"}, "properties": {"repobilityId": "28e11a5de5ce75ae", "scanner": "scanner-primary", "fingerprint": "6123837a71620c20", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-66434f29b11eb512", "level": "note", "message": {"text": "Very large file: apps/api/src/cruise-repository/cruise-repository.service.ts (1588 lines)"}, "properties": {"repobilityId": "7d9df8bda2b95e6f", "scanner": "scanner-primary", "fingerprint": "66434f29b11eb512", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3f07e182e3b5132d", "level": "note", "message": {"text": "Very large file: apps/api/src/ocr-import/ocr-import.service.ts (2766 lines)"}, "properties": {"repobilityId": "caecaa36c714f028", "scanner": "scanner-primary", "fingerprint": "3f07e182e3b5132d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4bb9c9313612e0d8", "level": "note", "message": {"text": "Very large file: apps/api/src/cruise-import/services/sailing-import.service.ts (1484 lines)"}, "properties": {"repobilityId": "37ce6acdddb33fdd", "scanner": "scanner-primary", "fingerprint": "4bb9c9313612e0d8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-47af71bc07405c76", "level": "note", "message": {"text": "Very large file: apps/admin/src/components/packages/packages-table.tsx (1759 lines)"}, "properties": {"repobilityId": "ad33c8deea812946", "scanner": "scanner-primary", "fingerprint": "47af71bc07405c76", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-daf8ff7a43e2124f", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/options-form.tsx (1251 lines)"}, "properties": {"repobilityId": "b51cd2190fc2fff9", "scanner": "scanner-primary", "fingerprint": "daf8ff7a43e2124f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cbd1d440a631b544", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/custom-cruise-form.tsx (2239 lines)"}, "properties": {"repobilityId": "5f7e483122198b0d", "scanner": "scanner-primary", "fingerprint": "cbd1d440a631b544", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-da2a0b82fa2ef68e", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/tour-form.tsx (1465 lines)"}, "properties": {"repobilityId": "bc696c8e11b9dc74", "scanner": "scanner-primary", "fingerprint": "da2a0b82fa2ef68e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5511246730cda656", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/lodging-form.tsx (1454 lines)"}, "properties": {"repobilityId": "ca0c2bafe5999df4", "scanner": "scanner-primary", "fingerprint": "5511246730cda656", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e551fc4a30d1f651", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/transportation-form.tsx (2209 lines)"}, "properties": {"repobilityId": "f20c85f72c52b3a9", "scanner": "scanner-primary", "fingerprint": "e551fc4a30d1f651", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-47c298579a7ab310", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/trips/[id]/_components/flight-form.tsx (2117 lines)"}, "properties": {"repobilityId": "2b69b4b84dbcb330", "scanner": "scanner-primary", "fingerprint": "47c298579a7ab310", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2f8b4375ad4409c9", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/contacts/[id]/page.tsx (1987 lines)"}, "properties": {"repobilityId": "238e2a8c08dae5a7", "scanner": "scanner-primary", "fingerprint": "2f8b4375ad4409c9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4db9276592065c1a", "level": "note", "message": {"text": "Very large file: scripts/migration/import-to-tailfire.ts (3614 lines)"}, "properties": {"repobilityId": "874232b5bb1d1fc8", "scanner": "scanner-primary", "fingerprint": "4db9276592065c1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "49b3b7127a97b6fa", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-9b8f493dac51a65f", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/client/package.json"}, "properties": {"repobilityId": "692800b1999a42ba", "scanner": "scanner-primary", "fingerprint": "9b8f493dac51a65f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/client/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5c30f715681a4005", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/admin/package.json"}, "properties": {"repobilityId": "17d56c8f05bdd359", "scanner": "scanner-primary", "fingerprint": "5c30f715681a4005", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1ae24c2e9d6105b9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/ota/package.json"}, "properties": {"repobilityId": "a0ce63d07f1b7eb8", "scanner": "scanner-primary", "fingerprint": "1ae24c2e9d6105b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ota/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eddecaa766cadff2", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/config/package.json"}, "properties": {"repobilityId": "03931bf3537e3eaf", "scanner": "scanner-primary", "fingerprint": "eddecaa766cadff2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/config/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-526a53ac2db6e202", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared-types/package.json"}, "properties": {"repobilityId": "72479dbac9b1ad66", "scanner": "scanner-primary", "fingerprint": "526a53ac2db6e202", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared-types/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb01c01804de0b47", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/database/package.json"}, "properties": {"repobilityId": "9b313fab9370ec72", "scanner": "scanner-primary", "fingerprint": "cb01c01804de0b47", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/database/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8e9a6bad34f0d301", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/trip-proposal-ui/package.json"}, "properties": {"repobilityId": "6c23ec0c4885cec1", "scanner": "scanner-primary", "fingerprint": "8e9a6bad34f0d301", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/trip-proposal-ui/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b7ecfb08533e7d1f", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/ui-public/package.json"}, "properties": {"repobilityId": "c3aa34af9386d8e8", "scanner": "scanner-primary", "fingerprint": "b7ecfb08533e7d1f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ui-public/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "5ebef67d112795c1", "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": "025d424525011e57", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "73d303401a8cca12", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "5527bd46d4ce6fa3", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "f399ce318985e970", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "7b9953502d522e4b", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "396e8a026618d18a", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "500b70a36315e006", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 173}}}]}, {"ruleId": "scanner-c05e8b612674499a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/client/src/lib/api.ts:56"}, "properties": {"repobilityId": "45f746590188e01e", "scanner": "scanner-primary", "fingerprint": "c05e8b612674499a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c8962ee90def9f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/client/src/hooks/use-client-profile.ts:54"}, "properties": {"repobilityId": "30ce810fc11636cb", "scanner": "scanner-primary", "fingerprint": "6c8962ee90def9f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dde524fd5b32e6c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/main.ts:77"}, "properties": {"repobilityId": "b79150a119854150", "scanner": "scanner-primary", "fingerprint": "dde524fd5b32e6c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e97a7f338abed5a5", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/automation/automation.service.ts:129"}, "properties": {"repobilityId": "5572d671d1779111", "scanner": "scanner-primary", "fingerprint": "e97a7f338abed5a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-800b80429c438fc3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/automation/listeners/trip-lifecycle.listener.ts:39"}, "properties": {"repobilityId": "f3f65c9797656724", "scanner": "scanner-primary", "fingerprint": "800b80429c438fc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e7fdfe24a657b41", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/automation/processors/client-care.processor.ts:1025"}, "properties": {"repobilityId": "cf810d0215aaae62", "scanner": "scanner-primary", "fingerprint": "9e7fdfe24a657b41", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-257fe0b0d424555b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/unsplash/unsplash.service.ts:203"}, "properties": {"repobilityId": "cdbb52a9cc7b434c", "scanner": "scanner-primary", "fingerprint": "257fe0b0d424555b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a939b1d6c546c1b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/financials/exchange-rates.service.ts:314"}, "properties": {"repobilityId": "78e8381984b194bb", "scanner": "scanner-primary", "fingerprint": "a939b1d6c546c1b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-74e14d99c4d5ec65", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/financials/trip-order.controller.ts:296"}, "properties": {"repobilityId": "412abea2aff3d20e", "scanner": "scanner-primary", "fingerprint": "74e14d99c4d5ec65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8d1302081455d30", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/financials/financial-summary.service.ts:129"}, "properties": {"repobilityId": "912344f4dae5ebff", "scanner": "scanner-primary", "fingerprint": "c8d1302081455d30", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fb72373e1708c8e", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/financials/trip-order.service.ts:178"}, "properties": {"repobilityId": "f97ca7a298ea2b6b", "scanner": "scanner-primary", "fingerprint": "3fb72373e1708c8e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ed017e8169d0003", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/financials/commission/commission-settlement-reversal.service.ts:128"}, "properties": {"repobilityId": "e028c6cf11c3a900", "scanner": "scanner-primary", "fingerprint": "6ed017e8169d0003", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44f0d45ebee57201", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/financials/commission/commission-drift.service.ts:159"}, "properties": {"repobilityId": "6278face55a5b79f", "scanner": "scanner-primary", "fingerprint": "44f0d45ebee57201", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4335351074cfc91", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/financials/commission/recall-clawback.service.ts:103"}, "properties": {"repobilityId": "2b074f9bfa24ffd4", "scanner": "scanner-primary", "fingerprint": "b4335351074cfc91", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6e7f42e4be18904", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-formula.ts:143"}, "properties": {"repobilityId": "e6476e1769f2c322", "scanner": "scanner-primary", "fingerprint": "f6e7f42e4be18904", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-394039b0cdc46cda", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/financials/commission/commission.service.ts:505"}, "properties": {"repobilityId": "02f4446365f45219", "scanner": "scanner-primary", "fingerprint": "394039b0cdc46cda", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44620484be09e8fb", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-reconcile.service.ts:467"}, "properties": {"repobilityId": "edf067b843f84371", "scanner": "scanner-primary", "fingerprint": "44620484be09e8fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b195fe4a88990864", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-drift.service.spec.ts:491"}, "properties": {"repobilityId": "71045bc6d033e2cf", "scanner": "scanner-primary", "fingerprint": "b195fe4a88990864", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aec85d4765cdb960", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-settlement-reversal.service.spec.ts:129"}, "properties": {"repobilityId": "b7066455a87fd242", "scanner": "scanner-primary", "fingerprint": "aec85d4765cdb960", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69e408f4e4f7e7c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/financials/commission/commission-reports.service.ts:345"}, "properties": {"repobilityId": "c7330882b3745cbc", "scanner": "scanner-primary", "fingerprint": "69e408f4e4f7e7c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0a9e9534eb3197b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/email-accounts/email-accounts.service.ts:657"}, "properties": {"repobilityId": "82f63536065eaf31", "scanner": "scanner-primary", "fingerprint": "b0a9e9534eb3197b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dfb699f0effe0841", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/email-accounts/smtp-send.service.ts:30"}, "properties": {"repobilityId": "88d2c16e4c563ca7", "scanner": "scanner-primary", "fingerprint": "dfb699f0effe0841", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c00e1903ce5a7b02", "level": "note", "message": {"text": "Legacy-named symbol `deleteOld` in apps/api/src/notifications/platform-notification.service.ts:311"}, "properties": {"repobilityId": "06f9d0a79cc5d6ea", "scanner": "scanner-primary", "fingerprint": "c00e1903ce5a7b02", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eb68561a95505532", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/notifications/listeners/notification-events.listener.ts:525"}, "properties": {"repobilityId": "b789cb6fe4fe306a", "scanner": "scanner-primary", "fingerprint": "eb68561a95505532", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d20bb6e9a601513", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/email/email.service.ts:172"}, "properties": {"repobilityId": "ba78285ad2a9f578", "scanner": "scanner-primary", "fingerprint": "7d20bb6e9a601513", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e29a44dc510f22b5", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/trips/trips.module.ts:223"}, "properties": {"repobilityId": "428c492c37a6da46", "scanner": "scanner-primary", "fingerprint": "e29a44dc510f22b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5cc404b8f46e5fb3", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/trips/trip-access.service.ts:140"}, "properties": {"repobilityId": "f7de5e1896ed2ff3", "scanner": "scanner-primary", "fingerprint": "5cc404b8f46e5fb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-136aefede0d07d4d", "level": "note", "message": {"text": "Legacy-named symbol `supplierLegacy` in apps/api/src/trips/activities.service.ts:2720"}, "properties": {"repobilityId": "64c979f2225621bc", "scanner": "scanner-primary", "fingerprint": "136aefede0d07d4d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4ad80bbf7044b949", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/trips/activities.service.ts:163"}, "properties": {"repobilityId": "3ab554f5137f0c4f", "scanner": "scanner-primary", "fingerprint": "4ad80bbf7044b949", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0b3d9466c27909b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/trips/trip-access.service.spec.ts:480"}, "properties": {"repobilityId": "0274ee46a8bc3f05", "scanner": "scanner-primary", "fingerprint": "c0b3d9466c27909b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-79fd8635486e2774", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/trips/itinerary-days.service.ts:123"}, "properties": {"repobilityId": "56571360d98e6bcb", "scanner": "scanner-primary", "fingerprint": "79fd8635486e2774", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c43016b3e6e2619", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/trips/payment-schedules.service.ts:324"}, "properties": {"repobilityId": "153f00efdbb146a3", "scanner": "scanner-primary", "fingerprint": "7c43016b3e6e2619", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-819cd3b2128d7c7b", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/trips/insurance.service.ts:352"}, "properties": {"repobilityId": "c7e46dc2fd742a90", "scanner": "scanner-primary", "fingerprint": "819cd3b2128d7c7b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80c6c1926efe3b2f", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/trips/activity-media.controller.ts:137"}, "properties": {"repobilityId": "c00523367759b8a2", "scanner": "scanner-primary", "fingerprint": "80c6c1926efe3b2f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84ec1afb15f40633", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/trips/merge-itineraries.service.ts:166"}, "properties": {"repobilityId": "2b588af9ff50ce39", "scanner": "scanner-primary", "fingerprint": "84ec1afb15f40633", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3787963e1b0d6374", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/trips/flight-segments.service.ts:201"}, "properties": {"repobilityId": "e7175b63843b757d", "scanner": "scanner-primary", "fingerprint": "3787963e1b0d6374", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53de014595776011", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/trips/component-orchestration.service.ts:468"}, "properties": {"repobilityId": "597675153b56fe26", "scanner": "scanner-primary", "fingerprint": "53de014595776011", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff8bcda702deed3f", "level": "none", "message": {"text": "Commented-code block (12 lines) in apps/api/src/trips/trip-travelers.service.ts:123"}, "properties": {"repobilityId": "13fcf4d6a66847a9", "scanner": "scanner-primary", "fingerprint": "ff8bcda702deed3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d7a934d754c8f0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/trips/trips.service.ts:2049"}, "properties": {"repobilityId": "faa7d124ff613a56", "scanner": "scanner-primary", "fingerprint": "6d7a934d754c8f0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb17aaf7fa88f9c8", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/trips/activities.controller.ts:141"}, "properties": {"repobilityId": "f1294b4aa6e68f62", "scanner": "scanner-primary", "fingerprint": "bb17aaf7fa88f9c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3e9cae8f09e25d3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/trips/activity-bookings.service.ts:74"}, "properties": {"repobilityId": "10bd4559cc4e28b8", "scanner": "scanner-primary", "fingerprint": "f3e9cae8f09e25d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-367150239b9ec241", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/trips/__tests__/proposal-archived-itinerary-exclusion.integration.spec.ts:110"}, "properties": {"repobilityId": "08d00f67d5661c9a", "scanner": "scanner-primary", "fingerprint": "367150239b9ec241", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1b00dec2848b770", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/trips/__tests__/legacy-routes-deprecation.spec.ts:14"}, "properties": {"repobilityId": "43849db911f086a4", "scanner": "scanner-primary", "fingerprint": "d1b00dec2848b770", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-657c3d1d1cfcb44b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/reporting/queries/compliance.queries.ts:395"}, "properties": {"repobilityId": "dd65ca3b516db05a", "scanner": "scanner-primary", "fingerprint": "657c3d1d1cfcb44b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f35643132cb38acc", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/reporting/queries/financial.queries.ts:480"}, "properties": {"repobilityId": "7ae3f7563e09461c", "scanner": "scanner-primary", "fingerprint": "f35643132cb38acc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d588a40ccf607a18", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/ic-payouts/__tests__/disbursement-failure-path.spec.ts:125"}, "properties": {"repobilityId": "a225aadaeeb466db", "scanner": "scanner-primary", "fingerprint": "d588a40ccf607a18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8bf8a4fff81c6d3a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/ic-payouts/disbursements/disbursement.service.ts:310"}, "properties": {"repobilityId": "06ccc4312775d761", "scanner": "scanner-primary", "fingerprint": "8bf8a4fff81c6d3a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a0d101e12305cecb", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/ic-payouts/payout-accounts/ic-payout-accounts.service.ts:87"}, "properties": {"repobilityId": "5d5823d5af009ae5", "scanner": "scanner-primary", "fingerprint": "a0d101e12305cecb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d88c00beb1070857", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/ic-payouts/backfill/ic-backfill.service.ts:508"}, "properties": {"repobilityId": "1485ab531bbc1643", "scanner": "scanner-primary", "fingerprint": "d88c00beb1070857", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c6d7a1d49db16bc", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/ic-payouts/backfill/dto/backfill-invoice.dto.ts:18"}, "properties": {"repobilityId": "8df17601f495f2ac", "scanner": "scanner-primary", "fingerprint": "6c6d7a1d49db16bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fef4a326336aa39", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/ic-payouts/invoices/ic-invoice.controller.ts:246"}, "properties": {"repobilityId": "207f686c8f0be0de", "scanner": "scanner-primary", "fingerprint": "0fef4a326336aa39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-421dc7ec3143c60a", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/api/src/ic-payouts/invoices/ic-invoice.service.ts:198"}, "properties": {"repobilityId": "038b4d0b2998fe65", "scanner": "scanner-primary", "fingerprint": "421dc7ec3143c60a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42af6312129d20dd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/ic-payouts/invoices/__tests__/ic-invoice.service.spec.ts:72"}, "properties": {"repobilityId": "8b617a275b7573b5", "scanner": "scanner-primary", "fingerprint": "42af6312129d20dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2f15802abc8c6fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/ic-payouts/invoices/__tests__/ic-invoice.service.spec.ts:274"}, "properties": {"repobilityId": "00bcb84b19fd4065", "scanner": "scanner-primary", "fingerprint": "a2f15802abc8c6fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ba77ac4eaa1fc75", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/external-apis/providers/amadeus/amadeus-hotels.provider.ts:181"}, "properties": {"repobilityId": "cda00415e5cc4512", "scanner": "scanner-primary", "fingerprint": "0ba77ac4eaa1fc75", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f74ea56b1fbe9b8", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/cruise-booking/services/import-booking.service.ts:457"}, "properties": {"repobilityId": "474bdea631389f71", "scanner": "scanner-primary", "fingerprint": "9f74ea56b1fbe9b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-136022414a8184c8", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/document-templates/document-templates.service.ts:947"}, "properties": {"repobilityId": "848e58f7f5676fd8", "scanner": "scanner-primary", "fingerprint": "136022414a8184c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11990d0e1ab680d6", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/document-templates/document-templates.controller.ts:70"}, "properties": {"repobilityId": "71ce05bc99b99d7e", "scanner": "scanner-primary", "fingerprint": "11990d0e1ab680d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4bf15a421d3b8fa", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/document-templates/system-templates/trip-order.template.ts:17"}, "properties": {"repobilityId": "59e8bf092037b300", "scanner": "scanner-primary", "fingerprint": "a4bf15a421d3b8fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2be871941c0a65c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/tasks/task-access.service.ts:76"}, "properties": {"repobilityId": "78f9d54f0a521393", "scanner": "scanner-primary", "fingerprint": "e2be871941c0a65c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2e8fe960e5a3647", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/consumer-auth/turnstile.service.ts:55"}, "properties": {"repobilityId": "e2359376fe839b4e", "scanner": "scanner-primary", "fingerprint": "e2e8fe960e5a3647", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10d91c5af0342522", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/cruise-repository/cruise-repository.service.ts:1123"}, "properties": {"repobilityId": "ab1841ff3746395e", "scanner": "scanner-primary", "fingerprint": "10d91c5af0342522", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ab4cfd41b0813e6", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/suppliers/suppliers.service.ts:114"}, "properties": {"repobilityId": "751fb1d36141d56a", "scanner": "scanner-primary", "fingerprint": "6ab4cfd41b0813e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e606c15badcfcab9", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/portal/portal.service.ts:841"}, "properties": {"repobilityId": "2adb3e1c1bd9acac", "scanner": "scanner-primary", "fingerprint": "e606c15badcfcab9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec22764f070b1d8f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/contacts/contacts.service.ts:247"}, "properties": {"repobilityId": "5582eb31c91e8604", "scanner": "scanner-primary", "fingerprint": "ec22764f070b1d8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55e12f5463e2b8c9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/tour-import/tour-import.service.ts:316"}, "properties": {"repobilityId": "6ff0e601782f9592", "scanner": "scanner-primary", "fingerprint": "55e12f5463e2b8c9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf608ad3636912d0", "level": "note", "message": {"text": "Legacy-named symbol `rest_v1` in apps/api/src/destinations/wikipedia.service.ts:35"}, "properties": {"repobilityId": "f960e631c9d45cd1", "scanner": "scanner-primary", "fingerprint": "cf608ad3636912d0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8065c1f7cd008a51", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/destinations/wikipedia.service.ts:25"}, "properties": {"repobilityId": "09a489fff28d34bc", "scanner": "scanner-primary", "fingerprint": "8065c1f7cd008a51", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-449db257071e947b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/cruise-import/services/import-orchestrator.service.ts:104"}, "properties": {"repobilityId": "d47f1a4d78e6ef12", "scanner": "scanner-primary", "fingerprint": "449db257071e947b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec95f36be2c88ee9", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/forms/forms.service.ts:552"}, "properties": {"repobilityId": "18964b7a4f88a409", "scanner": "scanner-primary", "fingerprint": "ec95f36be2c88ee9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb677dbbfc9d8c58", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/storage/providers/storage-provider.factory.ts:189"}, "properties": {"repobilityId": "e9fd768659685c02", "scanner": "scanner-primary", "fingerprint": "eb677dbbfc9d8c58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8f25608272d8728", "level": "note", "message": {"text": "Legacy-named symbol `hashB_old` in apps/api/src/vacation-import/services/__tests__/change-detector.service.spec.ts:69"}, "properties": {"repobilityId": "bd5ba1af4a86b36d", "scanner": "scanner-primary", "fingerprint": "b8f25608272d8728", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-78c2f0a787e84343", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/admin/vitest.config.ts:23"}, "properties": {"repobilityId": "9616f28aac4334f6", "scanner": "scanner-primary", "fingerprint": "78c2f0a787e84343", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1abac9976e1467e6", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/middleware.ts:116"}, "properties": {"repobilityId": "a6ad93a90cd2876a", "scanner": "scanner-primary", "fingerprint": "1abac9976e1467e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b6dadc7fa7fa446", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/components/media-uploader.tsx:208"}, "properties": {"repobilityId": "c93b7db25fd3ab20", "scanner": "scanner-primary", "fingerprint": "0b6dadc7fa7fa446", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-19d8e96bbf709a39", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/components/document-uploader.tsx:244"}, "properties": {"repobilityId": "bf776f032f43a6ca", "scanner": "scanner-primary", "fingerprint": "19d8e96bbf709a39", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1045c4b66ed72ed0", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/components/trips/trips-kanban.tsx:236"}, "properties": {"repobilityId": "513314d7dc9d5d50", "scanner": "scanner-primary", "fingerprint": "1045c4b66ed72ed0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34be81c77ca4cd36", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/components/ui/resizable-pane-layout.tsx:52"}, "properties": {"repobilityId": "b338bd9c9acc8112", "scanner": "scanner-primary", "fingerprint": "34be81c77ca4cd36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-97939d6bb022697b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/components/ui/date-picker-enhanced.tsx:133"}, "properties": {"repobilityId": "4864e2815efc37fc", "scanner": "scanner-primary", "fingerprint": "97939d6bb022697b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff467357d4f3514e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/components/activities/booking-header-button.tsx:207"}, "properties": {"repobilityId": "8dc8a5988ef76788", "scanner": "scanner-primary", "fingerprint": "ff467357d4f3514e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef560af3c3356f39", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/components/pricing/pricing-section.tsx:161"}, "properties": {"repobilityId": "881dfb5972c11ea3", "scanner": "scanner-primary", "fingerprint": "ef560af3c3356f39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e47fb60d63bd8f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/components/pricing/commission-section.tsx:84"}, "properties": {"repobilityId": "c0e091e66bd3bd7c", "scanner": "scanner-primary", "fingerprint": "5e47fb60d63bd8f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e783b71d0f843d9b", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/providers/auth-provider.tsx:68"}, "properties": {"repobilityId": "690fed3dbe641e7b", "scanner": "scanner-primary", "fingerprint": "e783b71d0f843d9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be940ba06078105b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/library/layout.tsx:100"}, "properties": {"repobilityId": "bf11253e00f1bf61", "scanner": "scanner-primary", "fingerprint": "be940ba06078105b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c31ad534d2ea8c6", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/library/cruises/page.tsx:78"}, "properties": {"repobilityId": "e82e777d6f997bd9", "scanner": "scanner-primary", "fingerprint": "8c31ad534d2ea8c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7be0813ff7e26099", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/app/library/templates/[id]/edit/_editor-content.tsx:98"}, "properties": {"repobilityId": "a0d1dd43cf9da361", "scanner": "scanner-primary", "fingerprint": "7be0813ff7e26099", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a4d541cdf18cc49", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/auth/reset-password/page.tsx:119"}, "properties": {"repobilityId": "69836e96d580bf81", "scanner": "scanner-primary", "fingerprint": "3a4d541cdf18cc49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cdf1caa34d98af29", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/auth/mfa-enroll/page.tsx:68"}, "properties": {"repobilityId": "1656a283a1886f99", "scanner": "scanner-primary", "fingerprint": "cdf1caa34d98af29", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8d487263bb8d4e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/page.tsx:94"}, "properties": {"repobilityId": "2a8dee616d9d3489", "scanner": "scanner-primary", "fingerprint": "a8d487263bb8d4e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a5a87e412e08197", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/page.tsx:398"}, "properties": {"repobilityId": "8848009d4e27bae5", "scanner": "scanner-primary", "fingerprint": "9a5a87e412e08197", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a950b8a8500c4b4", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/itinerary-table-view.tsx:278"}, "properties": {"repobilityId": "bba1e553cf3b1513", "scanner": "scanner-primary", "fingerprint": "3a950b8a8500c4b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c162397ed2b3c346", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/trips/[id]/_components/custom-cruise-form.tsx:1581"}, "properties": {"repobilityId": "963077f1068603cb", "scanner": "scanner-primary", "fingerprint": "c162397ed2b3c346", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9c1f6518febac263", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/trip-insurance.tsx:799"}, "properties": {"repobilityId": "96c553cbf7ce7f56", "scanner": "scanner-primary", "fingerprint": "9c1f6518febac263", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62f1bdacdb888440", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/app/trips/[id]/_components/itinerary-days-list.tsx:46"}, "properties": {"repobilityId": "e86d5e02eb9f8cbc", "scanner": "scanner-primary", "fingerprint": "62f1bdacdb888440", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cdc48fd3ffc9f595", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/tour-form.tsx:296"}, "properties": {"repobilityId": "ef2305e6e706c8ae", "scanner": "scanner-primary", "fingerprint": "cdc48fd3ffc9f595", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59e49ccfd0790739", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/admin/src/app/trips/[id]/_components/trip-itinerary.tsx:68"}, "properties": {"repobilityId": "a5c4d12e546e4b7b", "scanner": "scanner-primary", "fingerprint": "59e49ccfd0790739", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5517af0fce4ac98f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/transportation-form.tsx:397"}, "properties": {"repobilityId": "631c2c7b89beddb6", "scanner": "scanner-primary", "fingerprint": "5517af0fce4ac98f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77072f1214db87ab", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/app/trips/[id]/_components/flight-form.tsx:376"}, "properties": {"repobilityId": "1b0d341b028f5548", "scanner": "scanner-primary", "fingerprint": "77072f1214db87ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d1942b950c84ae5", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/dining-form.tsx:169"}, "properties": {"repobilityId": "1eac0cbf393454aa", "scanner": "scanner-primary", "fingerprint": "0d1942b950c84ae5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-653d9e1b03bf7d31", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/trips/[id]/_components/payment-schedule-section.tsx:541"}, "properties": {"repobilityId": "99aea73547f4cfd7", "scanner": "scanner-primary", "fingerprint": "653d9e1b03bf7d31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6198bcd3bac130ee", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/app/profile/_components/email-tab.tsx:89"}, "properties": {"repobilityId": "1853b3671799a6c2", "scanner": "scanner-primary", "fingerprint": "6198bcd3bac130ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98df216d44d676f7", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/app/commission/receive/page.tsx:273"}, "properties": {"repobilityId": "352add986f3b82e7", "scanner": "scanner-primary", "fingerprint": "98df216d44d676f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1fbfc1957855686e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/commission/receive/_components/deposit-builder.tsx:141"}, "properties": {"repobilityId": "e3704991c9d86b95", "scanner": "scanner-primary", "fingerprint": "1fbfc1957855686e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-936cf9e47ecba441", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/commission/receive/_components/pending-receivables-table.tsx:147"}, "properties": {"repobilityId": "b9ca93591fe34ba0", "scanner": "scanner-primary", "fingerprint": "936cf9e47ecba441", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fb0ef3f04ea778e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/commission/receive/_components/match-item-dialog.tsx:47"}, "properties": {"repobilityId": "cb1dbecf836cace2", "scanner": "scanner-primary", "fingerprint": "7fb0ef3f04ea778e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3e2e19b26ea2763", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/calendar/_components/calendar-list-view.tsx:17"}, "properties": {"repobilityId": "11736fc885174031", "scanner": "scanner-primary", "fingerprint": "c3e2e19b26ea2763", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-837edabc5850cc06", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/app/calendar/_components/calendar-day-view.tsx:39"}, "properties": {"repobilityId": "3ef350051a23d302", "scanner": "scanner-primary", "fingerprint": "837edabc5850cc06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4207c78add3c7579", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/api.ts:164"}, "properties": {"repobilityId": "afa0084f5e39fc59", "scanner": "scanner-primary", "fingerprint": "4207c78add3c7579", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f4f9f53f7593265", "level": "note", "message": {"text": "Legacy-named symbol `normalizedOld` in apps/admin/src/lib/snapshot-utils.ts:203"}, "properties": {"repobilityId": "bb6e58f603af691f", "scanner": "scanner-primary", "fingerprint": "7f4f9f53f7593265", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f02607486066bcd0", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/utils.ts:8"}, "properties": {"repobilityId": "df8f12acadda3b1b", "scanner": "scanner-primary", "fingerprint": "f02607486066bcd0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-516af0c882740b9e", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/validation/dining-validation.ts:44"}, "properties": {"repobilityId": "5f2e7ef10bf50eee", "scanner": "scanner-primary", "fingerprint": "516af0c882740b9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16feac776c1340e5", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/admin/src/lib/validation/flight-validation.ts:18"}, "properties": {"repobilityId": "acf8159e0ee069da", "scanner": "scanner-primary", "fingerprint": "16feac776c1340e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e03808d9f2f5e28b", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/admin/src/lib/validation/transportation-validation.ts:413"}, "properties": {"repobilityId": "9cc6810935d2bcb7", "scanner": "scanner-primary", "fingerprint": "e03808d9f2f5e28b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e434d231a8454233", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/validation/options-validation.ts:46"}, "properties": {"repobilityId": "bbf250ee2471a7bc", "scanner": "scanner-primary", "fingerprint": "e434d231a8454233", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69d78a966862b535", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/validation/cruise-validation.ts:113"}, "properties": {"repobilityId": "61273ab4c550fe24", "scanner": "scanner-primary", "fingerprint": "69d78a966862b535", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc71c2cf42b18468", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/lib/validation/__tests__/start-end-datetime-rollup.test.ts:213"}, "properties": {"repobilityId": "28b2b39214a43115", "scanner": "scanner-primary", "fingerprint": "cc71c2cf42b18468", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-545bca28c04e0d5c", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/admin/src/lib/supabase/middleware.ts:46"}, "properties": {"repobilityId": "e3ca6ac030d77a08", "scanner": "scanner-primary", "fingerprint": "545bca28c04e0d5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a1a5a2bbb4171f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/lib/dirty-guard/dirty-guard-provider.tsx:125"}, "properties": {"repobilityId": "82443f730bacabe9", "scanner": "scanner-primary", "fingerprint": "1a1a5a2bbb4171f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e4c7c4f50e4d11e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/lib/calendar/event-priority.spec.ts:15"}, "properties": {"repobilityId": "a6423bb1d4fe76b4", "scanner": "scanner-primary", "fingerprint": "6e4c7c4f50e4d11e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4357290b7a3bc53c", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/admin/src/lib/pricing/currency-helpers.ts:68"}, "properties": {"repobilityId": "f1f03fee1ddaf25b", "scanner": "scanner-primary", "fingerprint": "4357290b7a3bc53c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cbbcc8de14c66a9d", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/admin/src/hooks/use-activity-form-lifecycle.ts:232"}, "properties": {"repobilityId": "7320ef22f3ab5917", "scanner": "scanner-primary", "fingerprint": "cbbcc8de14c66a9d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ccd34eb9f9c81e11", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-reporting.ts:90"}, "properties": {"repobilityId": "81735441d0999bdd", "scanner": "scanner-primary", "fingerprint": "ccd34eb9f9c81e11", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-61932fd9da2f9683", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-activity-form-lifecycle.spec.ts:339"}, "properties": {"repobilityId": "89dcde0d33870daf", "scanner": "scanner-primary", "fingerprint": "61932fd9da2f9683", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96d4e39e0dd11efc", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/hooks/use-tours.ts:56"}, "properties": {"repobilityId": "9a49b6a78353ca49", "scanner": "scanner-primary", "fingerprint": "96d4e39e0dd11efc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6db7a2d62e71284", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-activity-bookings.ts:40"}, "properties": {"repobilityId": "d07abdf7acd3ec4b", "scanner": "scanner-primary", "fingerprint": "c6db7a2d62e71284", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f69bde9250339474", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-payment-schedules.ts:156"}, "properties": {"repobilityId": "5d762028ba7cc709", "scanner": "scanner-primary", "fingerprint": "f69bde9250339474", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c79a4227583a2d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-financial-summary.ts:113"}, "properties": {"repobilityId": "f82317cd30d417c3", "scanner": "scanner-primary", "fingerprint": "6c79a4227583a2d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9a84c8b1a84af6e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-mfa.ts:100"}, "properties": {"repobilityId": "281babc457a3fcce", "scanner": "scanner-primary", "fingerprint": "d9a84c8b1a84af6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e61d13d5da1dc8a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-reconcile.ts:57"}, "properties": {"repobilityId": "012180b1248b6563", "scanner": "scanner-primary", "fingerprint": "7e61d13d5da1dc8a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24d7a65315811d4a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/hooks/use-trip-orders.ts:252"}, "properties": {"repobilityId": "0412be4630360170", "scanner": "scanner-primary", "fingerprint": "24d7a65315811d4a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b4c4ed525119dbec", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/hooks/use-activity-navigation.ts:83"}, "properties": {"repobilityId": "9143048480d2f294", "scanner": "scanner-primary", "fingerprint": "b4c4ed525119dbec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb96341d38ceb0da", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-flights.ts:228"}, "properties": {"repobilityId": "51033a056f9f6ab6", "scanner": "scanner-primary", "fingerprint": "eb96341d38ceb0da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2656dec7799cd137", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/admin/src/hooks/use-merge-itineraries.ts:64"}, "properties": {"repobilityId": "734909776104ae7f", "scanner": "scanner-primary", "fingerprint": "2656dec7799cd137", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da37a0e7cdaaf3af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/hub/sections/client-hotel-results.tsx:130"}, "properties": {"repobilityId": "6b380da6ea768d94", "scanner": "scanner-primary", "fingerprint": "da37a0e7cdaaf3af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a2e392d77b37b872", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/hub/sections/client-flight-results.tsx:147"}, "properties": {"repobilityId": "4b9ae41410c58b6c", "scanner": "scanner-primary", "fingerprint": "a2e392d77b37b872", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a4662e3c52dda840", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/flights/flight-request-form.tsx:13"}, "properties": {"repobilityId": "9decc312398db646", "scanner": "scanner-primary", "fingerprint": "a4662e3c52dda840", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1076575010ef97e9", "level": "none", "message": {"text": "Commented-code block (11 lines) in apps/ota/src/components/flights/flight-search-client.tsx:256"}, "properties": {"repobilityId": "dcd49e9153a4baad", "scanner": "scanner-primary", "fingerprint": "1076575010ef97e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4e9c07b9509c4e1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/flights/flight-search-client.tsx:14"}, "properties": {"repobilityId": "9d163e944e9fa3bd", "scanner": "scanner-primary", "fingerprint": "e4e9c07b9509c4e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b001e167572f479", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/flights/flight-card.tsx:18"}, "properties": {"repobilityId": "58b2684eb3c6868d", "scanner": "scanner-primary", "fingerprint": "4b001e167572f479", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c8838cab18a2bc9", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ota/src/components/chat/chat-widget.tsx:101"}, "properties": {"repobilityId": "d55d80dbec43aac1", "scanner": "scanner-primary", "fingerprint": "6c8838cab18a2bc9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a1e205c59eca230", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/chat/chat-widget.tsx:31"}, "properties": {"repobilityId": "acb42bbf99e1b971", "scanner": "scanner-primary", "fingerprint": "0a1e205c59eca230", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b5f0069ae9f414c6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/join/register-form.tsx:75"}, "properties": {"repobilityId": "f67acda6750cf6bf", "scanner": "scanner-primary", "fingerprint": "b5f0069ae9f414c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-61f85821056d3e35", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/destinations/destination-gallery.tsx:48"}, "properties": {"repobilityId": "035c03d4aa16e803", "scanner": "scanner-primary", "fingerprint": "61f85821056d3e35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e21b40cb09652894", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/trip-builder/trip-basket-store.ts:86"}, "properties": {"repobilityId": "60336f7e317cba20", "scanner": "scanner-primary", "fingerprint": "e21b40cb09652894", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6b671b4584c725a4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/components/trip-builder/submit-review.tsx:68"}, "properties": {"repobilityId": "cbfdb5fafd6fdcf9", "scanner": "scanner-primary", "fingerprint": "6b671b4584c725a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-91dcbd64163a6d33", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/ota/src/components/deals/deal-quick-facts.tsx:7"}, "properties": {"repobilityId": "a36047b88804263e", "scanner": "scanner-primary", "fingerprint": "91dcbd64163a6d33", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16c5f5f57bb3031c", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/ota/src/app/robots.ts:3"}, "properties": {"repobilityId": "fba775b7eb827915", "scanner": "scanner-primary", "fingerprint": "16c5f5f57bb3031c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8083fd5660c69e92", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ota/src/app/sitemap.ts:4"}, "properties": {"repobilityId": "ebab7e8d417e1fb4", "scanner": "scanner-primary", "fingerprint": "8083fd5660c69e92", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a25dc468ddcd5860", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ota/src/app/sitemap.ts:96"}, "properties": {"repobilityId": "908208f0af975328", "scanner": "scanner-primary", "fingerprint": "a25dc468ddcd5860", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c55702fa09040c0", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ota/src/app/api/consumer-activity/route.ts:17"}, "properties": {"repobilityId": "0cff65a7deca88e9", "scanner": "scanner-primary", "fingerprint": "5c55702fa09040c0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a8f8afe2a595a057", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/demo/lib/guard.ts:28"}, "properties": {"repobilityId": "3c33de1c5f8494bb", "scanner": "scanner-primary", "fingerprint": "a8f8afe2a595a057", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be7a4b0572f5cef6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/fix-851-unarchive-planning-itineraries.ts:47"}, "properties": {"repobilityId": "71a0e9c3930731ac", "scanner": "scanner-primary", "fingerprint": "be7a4b0572f5cef6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2548be29f802c60d", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/migration/backfill-group-subtrip-payments.ts:366"}, "properties": {"repobilityId": "169352b2c048cc61", "scanner": "scanner-primary", "fingerprint": "2548be29f802c60d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a998a13710b9d8b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/backfill-group-subtrip-payments.ts:134"}, "properties": {"repobilityId": "fa8ef110df1bc526", "scanner": "scanner-primary", "fingerprint": "3a998a13710b9d8b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-27a8534483e0d722", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/migration/import-group-bookings.ts:274"}, "properties": {"repobilityId": "4cfdae0fd4b87ce4", "scanner": "scanner-primary", "fingerprint": "27a8534483e0d722", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a25b90ab7e799e66", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/import-group-bookings.ts:47"}, "properties": {"repobilityId": "221982eb44bd08be", "scanner": "scanner-primary", "fingerprint": "a25b90ab7e799e66", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bc6abe0861cf306b", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/migration/heal-issue844-insurance-premium.ts:196"}, "properties": {"repobilityId": "b8ca48d61f231394", "scanner": "scanner-primary", "fingerprint": "bc6abe0861cf306b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-462fc13b6cfd18c9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/ingest-payroll-csv.ts:148"}, "properties": {"repobilityId": "c34e1abb8186b5d5", "scanner": "scanner-primary", "fingerprint": "462fc13b6cfd18c9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-52f99815bcf2411e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/extract-travelesolutions.ts:45"}, "properties": {"repobilityId": "78e84213068c4c92", "scanner": "scanner-primary", "fingerprint": "52f99815bcf2411e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-80fccdb598a0903d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/supplier-dedup.ts:332"}, "properties": {"repobilityId": "b4e955dc697f654d", "scanner": "scanner-primary", "fingerprint": "80fccdb598a0903d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f9eed976cb6d75a", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/migration/verify-commission-mapping.ts:239"}, "properties": {"repobilityId": "7487d49a78f977fe", "scanner": "scanner-primary", "fingerprint": "0f9eed976cb6d75a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf99c4316fe086d0", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/migration/resync-commission-tracking-clean.ts:221"}, "properties": {"repobilityId": "f9258db19363c5a6", "scanner": "scanner-primary", "fingerprint": "cf99c4316fe086d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22e9ed6f58fe612c", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/migration/import-to-tailfire.ts:127"}, "properties": {"repobilityId": "36b2932d734ff101", "scanner": "scanner-primary", "fingerprint": "22e9ed6f58fe612c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bbd172a51da0088", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/import-to-tailfire.ts:174"}, "properties": {"repobilityId": "ba9e74ac875b607d", "scanner": "scanner-primary", "fingerprint": "6bbd172a51da0088", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f1f186baddd0b191", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/migration/backfill-issue834-payments.ts:241"}, "properties": {"repobilityId": "dc95a8e265d39e2b", "scanner": "scanner-primary", "fingerprint": "f1f186baddd0b191", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb295a7f1eb0ed69", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/backfill-issue834-payments.ts:151"}, "properties": {"repobilityId": "00d97a0a2ff14758", "scanner": "scanner-primary", "fingerprint": "cb295a7f1eb0ed69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9aae399794fb7fcb", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/migration/backfill-group-subtrip-travelers.ts:90"}, "properties": {"repobilityId": "ad5edc272abd0336", "scanner": "scanner-primary", "fingerprint": "9aae399794fb7fcb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60d7670cd54ba3e5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migration/backfill-group-subtrip-travelers.ts:78"}, "properties": {"repobilityId": "91cbde02700007c1", "scanner": "scanner-primary", "fingerprint": "60d7670cd54ba3e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b35835135445685", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/migration/waive-historical-platform-fees.ts:117"}, "properties": {"repobilityId": "8979f3b878702ff7", "scanner": "scanner-primary", "fingerprint": "1b35835135445685", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be9b4a6e96fbc189", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/migration/precut-5-provision-prod-agents.ts:324"}, "properties": {"repobilityId": "761a244c6cce7e15", "scanner": "scanner-primary", "fingerprint": "be9b4a6e96fbc189", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8d82d1b72bcdb12", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/e2e/flight-scenarios-e2e.ts:189"}, "properties": {"repobilityId": "b1ee0d1186723a2d", "scanner": "scanner-primary", "fingerprint": "d8d82d1b72bcdb12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-161b7e131a7002c0", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/shared-types/src/index.ts:27"}, "properties": {"repobilityId": "21de331639a4919f", "scanner": "scanner-primary", "fingerprint": "161b7e131a7002c0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a48ee3f5440d859f", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared-types/src/api/commission.types.ts:197"}, "properties": {"repobilityId": "ab8803830cba8984", "scanner": "scanner-primary", "fingerprint": "a48ee3f5440d859f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c2d4a1a554402ff", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared-types/src/api/components.types.ts:1023"}, "properties": {"repobilityId": "f006b3a0dd89d02b", "scanner": "scanner-primary", "fingerprint": "2c2d4a1a554402ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab8c8056e78b8f0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/shared-types/src/schemas/activity.schema.ts:23"}, "properties": {"repobilityId": "4a30fadbdfddbb03", "scanner": "scanner-primary", "fingerprint": "ab8c8056e78b8f0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3686484c5cb9dea5", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/database/scripts/replay-from-blank.ts:63"}, "properties": {"repobilityId": "3e87adce7bdc199a", "scanner": "scanner-primary", "fingerprint": "3686484c5cb9dea5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-041b4859141e89d4", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in packages/database/scripts/validate-migrations.ts:39"}, "properties": {"repobilityId": "b8dab886a15d1953", "scanner": "scanner-primary", "fingerprint": "041b4859141e89d4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-51c263f2d5e51cdc", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/database/scripts/validate-migrations.ts:113"}, "properties": {"repobilityId": "a99e7a6e2dd8c321", "scanner": "scanner-primary", "fingerprint": "51c263f2d5e51cdc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-696b597fede3232f", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/database/src/schema/commission-checks.schema.ts:53"}, "properties": {"repobilityId": "5388eec36f074b32", "scanner": "scanner-primary", "fingerprint": "696b597fede3232f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c46ebd37f51152d", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/database/src/schema/custom-cruise-details.schema.ts:91"}, "properties": {"repobilityId": "85b5b0749a007b38", "scanner": "scanner-primary", "fingerprint": "8c46ebd37f51152d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c12ca6b7f9a7342", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/database/src/schema/activity-pricing.schema.ts:62"}, "properties": {"repobilityId": "f75c1686cf425780", "scanner": "scanner-primary", "fingerprint": "8c12ca6b7f9a7342", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c5d2e3a48f2a097", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/database/src/schema/email.schema.ts:98"}, "properties": {"repobilityId": "51034a6c7367d05b", "scanner": "scanner-primary", "fingerprint": "7c5d2e3a48f2a097", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-61b6baa0313363e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/database/src/schema/insurance.schema.ts:99"}, "properties": {"repobilityId": "572887c3299ea083", "scanner": "scanner-primary", "fingerprint": "61b6baa0313363e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-adbcc42b85379e46", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/database/src/schema/flight-segments.schema.ts:21"}, "properties": {"repobilityId": "c6d181ca229bdb22", "scanner": "scanner-primary", "fingerprint": "adbcc42b85379e46", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f47b3afd40e2d4b0", "level": "none", "message": {"text": "Commented-code block (8 lines) in packages/database/src/schema/user-profiles.schema.ts:99"}, "properties": {"repobilityId": "66f94212e9e13dc8", "scanner": "scanner-primary", "fingerprint": "f47b3afd40e2d4b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-725ad92e44c20cf0", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/database/src/schema/trip-orders.schema.ts:69"}, "properties": {"repobilityId": "819f6dfd8917d03d", "scanner": "scanner-primary", "fingerprint": "725ad92e44c20cf0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-634e2f6a6200f5b7", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/database/src/schema/financials.schema.ts:282"}, "properties": {"repobilityId": "5211aef4ed81a236", "scanner": "scanner-primary", "fingerprint": "634e2f6a6200f5b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-32950460130430ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/trip-proposal-ui/src/components/ProposalShell.tsx:54"}, "properties": {"repobilityId": "cbedefb1ac656aa3", "scanner": "scanner-primary", "fingerprint": "32950460130430ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb87f14083523571", "level": "note", "message": {"text": "147 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "3623f1dabebcf193", "scanner": "scanner-primary", "fingerprint": "fb87f14083523571", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-232dbfeaa2337830", "level": "error", "message": {"text": "Dangling fetch: GET https://api.unsplash.com/photos/random?count=1 (apps/api/src/api-credentials/api-credentials.service.ts:703)"}, "properties": {"repobilityId": "7440400b58e91545", "scanner": "scanner-primary", "fingerprint": "232dbfeaa2337830", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-53438734be658a96", "level": "error", "message": {"text": "Dangling fetch: GET https://aerodatabox.p.rapidapi.com/airports/iata/${iataCode} (apps/api/src/trips/geocoding.service.ts:106)"}, "properties": {"repobilityId": "4827f3e969a29477", "scanner": "scanner-primary", "fingerprint": "53438734be658a96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a314b71ea9ec0d29", "level": "error", "message": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:searchText (apps/api/src/trips/geocoding.service.ts:179)"}, "properties": {"repobilityId": "26f9b249da00a3b4", "scanner": "scanner-primary", "fingerprint": "a314b71ea9ec0d29", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1971686cd72b8cd2", "level": "error", "message": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:searchText (apps/api/src/api-health/api-health.service.ts:354)"}, "properties": {"repobilityId": "b1803fc6470575d9", "scanner": "scanner-primary", "fingerprint": "1971686cd72b8cd2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b879e75d9b71bba3", "level": "error", "message": {"text": "Dangling fetch: GET https://api.stripe.com/v1/account (apps/api/src/api-health/api-health.service.ts:376)"}, "properties": {"repobilityId": "f8dba8617a946dbe", "scanner": "scanner-primary", "fingerprint": "b879e75d9b71bba3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0ccd8e66ee1e726a", "level": "error", "message": {"text": "Dangling fetch: GET https://api.resend.com/domains (apps/api/src/api-health/api-health.service.ts:393)"}, "properties": {"repobilityId": "403b6e34f80796d1", "scanner": "scanner-primary", "fingerprint": "0ccd8e66ee1e726a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-465684fb6e658e8f", "level": "error", "message": {"text": "Dangling fetch: GET https://api.unsplash.com/photos/random?count=1 (apps/api/src/api-health/api-health.service.ts:410)"}, "properties": {"repobilityId": "458a4fa69f66a5ad", "scanner": "scanner-primary", "fingerprint": "465684fb6e658e8f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59ad2cdedd13cbfa", "level": "error", "message": {"text": "Dangling fetch: GET https://api.openai.com/v1/models (apps/api/src/api-health/api-health.service.ts:427)"}, "properties": {"repobilityId": "13af52381049faed", "scanner": "scanner-primary", "fingerprint": "59ad2cdedd13cbfa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7cc7c74275098bf6", "level": "error", "message": {"text": "Dangling fetch: GET https://v6.exchangerate-api.com/v6/${apiKey}/latest/CAD (apps/api/src/api-health/api-health.service.ts:444)"}, "properties": {"repobilityId": "0a784b381c74b82f", "scanner": "scanner-primary", "fingerprint": "7cc7c74275098bf6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-94a0b0f8295f89f3", "level": "error", "message": {"text": "Dangling fetch: GET https://api.backblazeb2.com/b2api/v3/b2_authorize_account (apps/api/src/api-health/api-health.service.ts:509)"}, "properties": {"repobilityId": "9eead9e98c9a0e2c", "scanner": "scanner-primary", "fingerprint": "94a0b0f8295f89f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b2ba4dbf294d11f", "level": "error", "message": {"text": "Dangling fetch: GET https://serpapi.com/search.json?${params} (apps/api/src/destinations/serpapi.service.ts:77)"}, "properties": {"repobilityId": "d13fab698450fa3e", "scanner": "scanner-primary", "fingerprint": "1b2ba4dbf294d11f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dcfa54a04bceaeab", "level": "error", "message": {"text": "Dangling fetch: POST /auth/signout (apps/admin/src/app/auth/reset-password/page.tsx:119)"}, "properties": {"repobilityId": "1ad9b157db626861", "scanner": "scanner-primary", "fingerprint": "dcfa54a04bceaeab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c97df869889bc92", "level": "error", "message": {"text": "Dangling fetch: POST /auth/signout (apps/admin/src/app/auth/set-password/page.tsx:69)"}, "properties": {"repobilityId": "432d5cbb92d1c38d", "scanner": "scanner-primary", "fingerprint": "3c97df869889bc92", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84497df12d91de96", "level": "error", "message": {"text": "Dangling fetch: POST /api/mfa-skip (apps/admin/src/app/auth/mfa-enroll/page.tsx:113)"}, "properties": {"repobilityId": "910a8fe08bdb9b45", "scanner": "scanner-primary", "fingerprint": "84497df12d91de96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c1cd14ebebb701fb", "level": "error", "message": {"text": "Dangling fetch: POST /api/leads (apps/ota/src/components/layout/contact-form.tsx:48)"}, "properties": {"repobilityId": "0c247465747cc064", "scanner": "scanner-primary", "fingerprint": "c1cd14ebebb701fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a3a8237bdc1c4fc2", "level": "error", "message": {"text": "Dangling fetch: GET /api/hotels/search?${qs} (apps/ota/src/components/hub/sections/client-hotel-results.tsx:130)"}, "properties": {"repobilityId": "9d7bd7edcccc76b6", "scanner": "scanner-primary", "fingerprint": "a3a8237bdc1c4fc2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-52ecced78b773148", "level": "error", "message": {"text": "Dangling fetch: GET /api/flights/search?${qs} (apps/ota/src/components/hub/sections/client-flight-results.tsx:147)"}, "properties": {"repobilityId": "4b27c026ea5bb079", "scanner": "scanner-primary", "fingerprint": "52ecced78b773148", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-56e8a7b3a68c3326", "level": "error", "message": {"text": "Dangling fetch: POST /api/leads (apps/ota/src/components/join/register-form.tsx:75)"}, "properties": {"repobilityId": "e8ea6703c6189e51", "scanner": "scanner-primary", "fingerprint": "56e8a7b3a68c3326", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3f77cfc1aaabbbc1", "level": "error", "message": {"text": "Dangling fetch: GET /api/airports?keyword=${encodeURIComponent(keyword)} (apps/ota/src/components/search/airport-autocomplete.tsx:51)"}, "properties": {"repobilityId": "b0ff74e7310b0965", "scanner": "scanner-primary", "fingerprint": "3f77cfc1aaabbbc1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c9f009ece93c3f05", "level": "error", "message": {"text": "Dangling fetch: GET /api/destinations?${params.toString()} (apps/ota/src/components/destinations/destination-gallery.tsx:48)"}, "properties": {"repobilityId": "e6d29dc8ffaecb2f", "scanner": "scanner-primary", "fingerprint": "c9f009ece93c3f05", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d9c1b06521b0254", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/trip-requests/${requestId}/identity (apps/ota/src/components/trip-builder/submit-review.tsx:49)"}, "properties": {"repobilityId": "b3639929f37204fb", "scanner": "scanner-primary", "fingerprint": "8d9c1b06521b0254", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-472fda8ea2062779", "level": "error", "message": {"text": "Dangling fetch: POST /api/trip-requests/${requestId}/submit (apps/ota/src/components/trip-builder/submit-review.tsx:68)"}, "properties": {"repobilityId": "e1e3a2a0f7636978", "scanner": "scanner-primary", "fingerprint": "472fda8ea2062779", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c7277adebef537c8", "level": "error", "message": {"text": "Dangling fetch: POST /api/trip-requests/${requestId}/share (apps/ota/src/components/trip-builder/share-button.tsx:21)"}, "properties": {"repobilityId": "e6790374d4f009a3", "scanner": "scanner-primary", "fingerprint": "c7277adebef537c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-23c29000f0f5b644", "level": "error", "message": {"text": "Dangling fetch: POST /api/leads (apps/ota/src/components/advisor/advisor-contact-form.tsx:26)"}, "properties": {"repobilityId": "c3f7c44ef75691a7", "scanner": "scanner-primary", "fingerprint": "23c29000f0f5b644", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-223a5e745a3e6fc8", "level": "error", "message": {"text": "Dangling fetch: POST /api/consumer-activity (apps/ota/src/lib/tracking.ts:22)"}, "properties": {"repobilityId": "9f97510214545d5d", "scanner": "scanner-primary", "fingerprint": "223a5e745a3e6fc8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa948c53fbed1040", "level": "note", "message": {"text": "Unused endpoint: GET /debug-sentry"}, "properties": {"repobilityId": "d813affb1e0b348d", "scanner": "scanner-primary", "fingerprint": "fa948c53fbed1040", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-243359322763546b", "level": "note", "message": {"text": "Unused endpoint: GET /reference-data/cruise-lines"}, "properties": {"repobilityId": "5490b1c86cdcac52", "scanner": "scanner-primary", "fingerprint": "243359322763546b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9feb09e1ab618f29", "level": "note", "message": {"text": "Unused endpoint: GET /reference-data/cruise-ships"}, "properties": {"repobilityId": "ba671e70f8065b77", "scanner": "scanner-primary", "fingerprint": "9feb09e1ab618f29", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-29835d34d4f9021e", "level": "note", "message": {"text": "Unused endpoint: GET /reference-data/cruise-regions"}, "properties": {"repobilityId": "14375937165d66a1", "scanner": "scanner-primary", "fingerprint": "29835d34d4f9021e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1df454497e7be8a7", "level": "note", "message": {"text": "Unused endpoint: GET /reference-data/cruise-ports"}, "properties": {"repobilityId": "dd960c47eaa2fa16", "scanner": "scanner-primary", "fingerprint": "1df454497e7be8a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-16055747c5cb9c99", "level": "note", "message": {"text": "Unused endpoint: GET /reference-data/metadata"}, "properties": {"repobilityId": "40a1e0512bd5d93e", "scanner": "scanner-primary", "fingerprint": "16055747c5cb9c99", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b2c238099805732", "level": "note", "message": {"text": "Unused endpoint: POST /reference-data/refresh"}, "properties": {"repobilityId": "4250760168fcf50e", "scanner": "scanner-primary", "fingerprint": "5b2c238099805732", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4274890eaf4c29e9", "level": "note", "message": {"text": "Unused endpoint: USE /admin/queues"}, "properties": {"repobilityId": "8505a26a12d70094", "scanner": "scanner-primary", "fingerprint": "4274890eaf4c29e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-59d4d3ce92941ac3", "level": "note", "message": {"text": "Unused endpoint: GET /admin/automation/queues"}, "properties": {"repobilityId": "81aadf579d0a33ae", "scanner": "scanner-primary", "fingerprint": "59d4d3ce92941ac3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e835890d4758e103", "level": "note", "message": {"text": "Unused endpoint: GET /admin/automation/queues/:name/delayed"}, "properties": {"repobilityId": "d5823e95b181d668", "scanner": "scanner-primary", "fingerprint": "e835890d4758e103", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f7e58e95e8b24d5f", "level": "note", "message": {"text": "Unused endpoint: GET /admin/automation/jobs/:id"}, "properties": {"repobilityId": "69170d70658c40ec", "scanner": "scanner-primary", "fingerprint": "f7e58e95e8b24d5f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c2f00134cd526cb1", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/automation/jobs/:id"}, "properties": {"repobilityId": "54c413286dc02322", "scanner": "scanner-primary", "fingerprint": "c2f00134cd526cb1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b54e843444dc4cb2", "level": "note", "message": {"text": "Unused endpoint: POST /admin/automation/jobs/schedule"}, "properties": {"repobilityId": "d928e93e5592f5c4", "scanner": "scanner-primary", "fingerprint": "b54e843444dc4cb2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ec6ef77a25046cf", "level": "note", "message": {"text": "Unused endpoint: POST /admin/automation/trips/backfill"}, "properties": {"repobilityId": "ca3b57b0fe0705f8", "scanner": "scanner-primary", "fingerprint": "7ec6ef77a25046cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa2a08306028e25b", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/automation/jobs/pattern"}, "properties": {"repobilityId": "386585c4dcbbfc96", "scanner": "scanner-primary", "fingerprint": "fa2a08306028e25b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9baed25bd1e037c", "level": "note", "message": {"text": "Unused endpoint: GET /unsplash/status"}, "properties": {"repobilityId": "cb13e017954f70bc", "scanner": "scanner-primary", "fingerprint": "a9baed25bd1e037c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-611c0ccd9f6d4a9b", "level": "note", "message": {"text": "Unused endpoint: GET /unsplash/search"}, "properties": {"repobilityId": "d1da2683c8ec5021", "scanner": "scanner-primary", "fingerprint": "611c0ccd9f6d4a9b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7df3b5d8bd32daee", "level": "note", "message": {"text": "Unused endpoint: GET /activities/:activityId/splits"}, "properties": {"repobilityId": "d17a98fa7a817f71", "scanner": "scanner-primary", "fingerprint": "7df3b5d8bd32daee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e4f069d405c10d4", "level": "note", "message": {"text": "Unused endpoint: PUT /activities/:activityId/splits"}, "properties": {"repobilityId": "af4e30fec5371ca4", "scanner": "scanner-primary", "fingerprint": "5e4f069d405c10d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c8cdcd67e26f7b64", "level": "note", "message": {"text": "Unused endpoint: DELETE /activities/:activityId/splits"}, "properties": {"repobilityId": "a7e08209b77825de", "scanner": "scanner-primary", "fingerprint": "c8cdcd67e26f7b64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7549f0f528dacdd", "level": "note", "message": {"text": "Unused endpoint: GET /trips/:tripId/travellers/:travellerId/splits"}, "properties": {"repobilityId": "e004ce5269774f34", "scanner": "scanner-primary", "fingerprint": "c7549f0f528dacdd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bcae10047822ef6c", "level": "note", "message": {"text": "Unused endpoint: GET /trips/:tripId/financial-summary"}, "properties": {"repobilityId": "c6c799c561108317", "scanner": "scanner-primary", "fingerprint": "bcae10047822ef6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-161e1316fefe9c04", "level": "note", "message": {"text": "Unused endpoint: GET /agencies/:agencyId/settings"}, "properties": {"repobilityId": "cac1f2bc77289741", "scanner": "scanner-primary", "fingerprint": "161e1316fefe9c04", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-466fc096601e1eef", "level": "note", "message": {"text": "Unused endpoint: PATCH /agencies/:agencyId/settings"}, "properties": {"repobilityId": "feb8fc872a7b65b4", "scanner": "scanner-primary", "fingerprint": "466fc096601e1eef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-309765f11d613f92", "level": "note", "message": {"text": "Unused endpoint: POST /agencies/:agencyId/stripe/onboard"}, "properties": {"repobilityId": "d5105c61b138ecf0", "scanner": "scanner-primary", "fingerprint": "309765f11d613f92", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3df7ee7e4f134fc", "level": "note", "message": {"text": "Unused endpoint: GET /agencies/:agencyId/stripe/status"}, "properties": {"repobilityId": "feec7f07b8b1b841", "scanner": "scanner-primary", "fingerprint": "f3df7ee7e4f134fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ec982f88b5dce5c", "level": "note", "message": {"text": "Unused endpoint: POST /agencies/:agencyId/stripe/dashboard"}, "properties": {"repobilityId": "81acc30aa3247398", "scanner": "scanner-primary", "fingerprint": "7ec982f88b5dce5c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-97fa9c83bada31c0", "level": "note", "message": {"text": "Unused endpoint: POST /service-fees/:id/invoice"}, "properties": {"repobilityId": "ffa433b95072b38c", "scanner": "scanner-primary", "fingerprint": "97fa9c83bada31c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b7280804ac001e8", "level": "note", "message": {"text": "Unused endpoint: POST /service-fees/:id/stripe-refund"}, "properties": {"repobilityId": "86efb53d1b14c4dc", "scanner": "scanner-primary", "fingerprint": "9b7280804ac001e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1dfcc9529630142e", "level": "note", "message": {"text": "Unused endpoint: POST /webhooks/stripe"}, "properties": {"repobilityId": "7bc34cd4b7bbcd8b", "scanner": "scanner-primary", "fingerprint": "1dfcc9529630142e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-461edc8fb8a9ea57", "level": "note", "message": {"text": "Unused endpoint: GET /exchange-rates/:from/:to"}, "properties": {"repobilityId": "b642086a0b801fcf", "scanner": "scanner-primary", "fingerprint": "461edc8fb8a9ea57", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6002ee513434d1bf", "level": "note", "message": {"text": "Unused endpoint: POST /exchange-rates/convert"}, "properties": {"repobilityId": "5fe38593dafb8d09", "scanner": "scanner-primary", "fingerprint": "6002ee513434d1bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-03a528811f66b893", "level": "note", "message": {"text": "Unused endpoint: GET /exchange-rates/currencies"}, "properties": {"repobilityId": "bf0855e638396707", "scanner": "scanner-primary", "fingerprint": "03a528811f66b893", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b7b3fde1054c0817", "level": "note", "message": {"text": "Unused endpoint: GET /exchange-rates/:base/all"}, "properties": {"repobilityId": "0dedd72d2724fef8", "scanner": "scanner-primary", "fingerprint": "b7b3fde1054c0817", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-daef437f6efff5a3", "level": "note", "message": {"text": "Unused endpoint: GET /trips/:tripId/service-fees"}, "properties": {"repobilityId": "cde0509ab120c556", "scanner": "scanner-primary", "fingerprint": "daef437f6efff5a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1cbe4e9de3136fc3", "level": "note", "message": {"text": "Unused endpoint: GET /service-fees/:id"}, "properties": {"repobilityId": "781c3c8437cf90e0", "scanner": "scanner-primary", "fingerprint": "1cbe4e9de3136fc3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f42bed4ad0f8856", "level": "note", "message": {"text": "Unused endpoint: POST /trips/:tripId/service-fees"}, "properties": {"repobilityId": "0dde85c0c2123861", "scanner": "scanner-primary", "fingerprint": "6f42bed4ad0f8856", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-778b64bd7b197ac0", "level": "note", "message": {"text": "Unused endpoint: PATCH /service-fees/:id"}, "properties": {"repobilityId": "82a1a6551c56f6a9", "scanner": "scanner-primary", "fingerprint": "778b64bd7b197ac0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-73ad88dc8f2a428d", "level": "note", "message": {"text": "Unused endpoint: POST /service-fees/:id/send"}, "properties": {"repobilityId": "a65859ff16b3f866", "scanner": "scanner-primary", "fingerprint": "73ad88dc8f2a428d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-13f1defd295c4cd6", "level": "note", "message": {"text": "Unused endpoint: POST /service-fees/:id/mark-paid"}, "properties": {"repobilityId": "58bea75292854b04", "scanner": "scanner-primary", "fingerprint": "13f1defd295c4cd6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b41ce297e52695d2", "level": "note", "message": {"text": "Unused endpoint: POST /service-fees/:id/refund"}, "properties": {"repobilityId": "fe36f8d08e0798b3", "scanner": "scanner-primary", "fingerprint": "b41ce297e52695d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06625a4314d5ffab", "level": "note", "message": {"text": "Unused endpoint: POST /service-fees/:id/cancel"}, "properties": {"repobilityId": "1cc638e9b5dd98a2", "scanner": "scanner-primary", "fingerprint": "06625a4314d5ffab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a360df02c14c1b25", "level": "note", "message": {"text": "Unused endpoint: DELETE /service-fees/:id"}, "properties": {"repobilityId": "cfd6e9e15b1acddc", "scanner": "scanner-primary", "fingerprint": "a360df02c14c1b25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e658d6542534e42", "level": "note", "message": {"text": "Unused endpoint: POST /trips/:tripId/trip-orders"}, "properties": {"repobilityId": "648e775f88699ea6", "scanner": "scanner-primary", "fingerprint": "5e658d6542534e42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bb75640fd6aadf2", "level": "note", "message": {"text": "Unused endpoint: GET /trips/:tripId/trip-orders"}, "properties": {"repobilityId": "4ecb474325b97c1c", "scanner": "scanner-primary", "fingerprint": "1bb75640fd6aadf2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f06b3011ab40c07", "level": "note", "message": {"text": "Unused endpoint: GET /trips/:tripId/trip-orders/latest"}, "properties": {"repobilityId": "3dbec14a4bd5fb74", "scanner": "scanner-primary", "fingerprint": "2f06b3011ab40c07", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc2b7c17e7f93256", "level": "note", "message": {"text": "Unused endpoint: GET /trip-orders/:id"}, "properties": {"repobilityId": "37d63566fb910d54", "scanner": "scanner-primary", "fingerprint": "cc2b7c17e7f93256", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-51f8a4b961c29cd6", "level": "note", "message": {"text": "Unused endpoint: GET /trip-orders/:id/compliance"}, "properties": {"repobilityId": "1e47ddaf7350ec94", "scanner": "scanner-primary", "fingerprint": "51f8a4b961c29cd6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-607b6a68926dd669", "level": "note", "message": {"text": "Unused endpoint: POST /trip-orders/:id/finalize"}, "properties": {"repobilityId": "0e350547140f8902", "scanner": "scanner-primary", "fingerprint": "607b6a68926dd669", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-df75069b6c9319da", "level": "note", "message": {"text": "Unused endpoint: POST /trip-orders/:id/download"}, "properties": {"repobilityId": "791f40b8c748e0f1", "scanner": "scanner-primary", "fingerprint": "df75069b6c9319da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}