{"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-570a015bb233521e", "name": "Possibly dead Python function: startup", "shortDescription": {"text": "Possibly dead Python function: startup"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5bbebfb3f955a5a8", "name": "Possibly dead Python function: db_session", "shortDescription": {"text": "Possibly dead Python function: db_session"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9d1081575d1d074", "name": "Possibly dead Python function: current_user", "shortDescription": {"text": "Possibly dead Python function: current_user"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0d9604787c7da781", "name": "Possibly dead Python function: require_admin", "shortDescription": {"text": "Possibly dead Python function: require_admin"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c54a72899507ce93", "name": "Possibly dead Python function: capture_meta", "shortDescription": {"text": "Possibly dead Python function: capture_meta"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f6b16e453e6cf98", "name": "Possibly dead Python function: startup", "shortDescription": {"text": "Possibly dead Python function: startup"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-958ad4c3b30a4531", "name": "Possibly dead Python function: run_poll_loop", "shortDescription": {"text": "Possibly dead Python function: run_poll_loop"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35c5d6047f3bd771", "name": "Possibly dead Python function: sync_folder_to_tg", "shortDescription": {"text": "Possibly dead Python function: sync_folder_to_tg"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-56dcb5d145a7bc5e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/command-palette.tsx:318", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/command-palette.tsx:318"}, "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-8b49799c3c7cfd9f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/account-switcher.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/account-switcher.tsx:96"}, "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-57f3a1a81d066ec5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/user-menu.tsx:25", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/user-menu.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-8edb3b8d0937cea1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/settings/my-tg-accounts.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/settings/my-tg-accounts.tsx:55"}, "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-a5c1377055e7f8cc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/settings/ai-limits-card.tsx:392", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/settings/ai-limits-card.tsx:392"}, "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-9f2435a6ef28fb8e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/settings/shared-contacts-card.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/settings/shared-contacts-card.tsx:85"}, "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-6462e5938cc7e404", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/help/help-toc.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/help/help-toc.tsx:57"}, "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-8896f90f7aeafa06", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/notifications/notifications-list.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/notifications/notifications-list.tsx:68"}, "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-3c50e4efa5f77cd9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/draft-dialog.tsx:499", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/draft-dialog.tsx:499"}, "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-740bc27e137c25d1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/members-table.tsx:414", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/members-table.tsx:414"}, "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-08c6fa910947a69a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/cadence-state-panel.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/cadence-state-panel.tsx:121"}, "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-6655f8f32111b04a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/bulk-add-popover.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/bulk-add-popover.tsx:98"}, "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-9975402ed4bda2b5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/managers-panel.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/managers-panel.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-5c70c31625e3d27e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/curate-panel.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/curate-panel.tsx:211"}, "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-404d02d692ba8263", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/add-to-project-popover.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/add-to-project-popover.tsx:135"}, "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-598fff9a15e025cf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/ui/markdown-text.tsx:11", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/ui/markdown-text.tsx:11"}, "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-714a2c167a5b0a78", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/stat-strip.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/stat-strip.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-efb2c4e5b5247baa", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/ai-limits-warning-card.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/ai-limits-warning-card.tsx:115"}, "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-f2484c0ee9fce172", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/next-actions-card.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/next-actions-card.tsx:127"}, "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-6bf19ce841e2ed80", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/digest-section.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/digest-section.tsx:98"}, "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-41ac680a469350f3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/hidden-triage-list.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/hidden-triage-list.tsx:91"}, "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-37e7f285635b131c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/shared-with-you-card.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/shared-with-you-card.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-871b6de21d55eb5f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/triage-queue-card.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/triage-queue-card.tsx:171"}, "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-8fe6f5c5c51be1f0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/my-day-card.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/my-day-card.tsx:80"}, "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-12b3a7044fad8bc3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/warm-contacts-card.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/warm-contacts-card.tsx:35"}, "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-6d371da6c9254ddb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/reply-window.tsx:621", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/reply-window.tsx:621"}, "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-8153327fab5c6291", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/participants-tab.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/participants-tab.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-5c79863030702839", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/topics-tab.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/topics-tab.tsx:55"}, "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-3000489d9e3b2aa5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-history.tsx:212", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-history.tsx:212"}, "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-b02909de16953a25", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/message-hits.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/message-hits.tsx:123"}, "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-11f8d6e1c1492295", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/chats/message-hits.tsx:38", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/chats/message-hits.tsx:38"}, "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-6026688247aa4c18", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-header.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-header.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-83d461409d643ead", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/TopicsList.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/TopicsList.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-5b09642230218d72", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/share-contact-dialog.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/share-contact-dialog.tsx:210"}, "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-9ed26b95194630f5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/semantic-hits.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/semantic-hits.tsx:91"}, "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-b467675098768704", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/add-chat-dialog.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/add-chat-dialog.tsx:151"}, "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-5fa714ec30a3e7f9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/folder-members-dialog.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/folder-members-dialog.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-4f0de9a941be2f48", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-row.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-row.tsx:171"}, "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-e357cd847ae711ff", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-cadence-block.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-cadence-block.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-73258de48dc7eced", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/cadence-wizard/step-attachments.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/cadence-wizard/step-attachments.tsx:128"}, "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-27314b564306fa38", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/tasks/contact-picker.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/tasks/contact-picker.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-abe236d088a88979", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/tasks/tasks-list.tsx:709", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/tasks/tasks-list.tsx:709"}, "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-5777a21a7c1a4086", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/tasks/new-task-dialog.tsx:318", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/tasks/new-task-dialog.tsx:318"}, "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-30cb4e714e261998", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/admin/TGAccountList.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/admin/TGAccountList.tsx:122"}, "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-cf3ebcae3824db3c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/admin/ScopeAccessPanel.tsx:326", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/admin/ScopeAccessPanel.tsx:326"}, "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-fe10d82ee5cade23", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/me-grants/me-grants-client.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/me-grants/me-grants-client.tsx:83"}, "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-d27e918be2eff8e0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/broadcasts/create-broadcast-dialog.tsx:437", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/broadcasts/create-broadcast-dialog.tsx:437"}, "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-6f6101ee119df187", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/broadcasts/broadcast-detail.tsx:344", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/broadcasts/broadcast-detail.tsx:344"}, "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-9f42e05daac203ea", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/cadences/CadenceEditor.tsx:746", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/cadences/CadenceEditor.tsx:746"}, "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-f6d4cd3e7cd4687f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/person-meta-card.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/person-meta-card.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-5afca2990fbf328d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/activity-tab.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/activity-tab.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-2eabbc1c5ab44ec3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/person-row.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/person-row.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f451dad2fe6407ab", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/in-chats-tab.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/in-chats-tab.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-563cb50340dc4a53", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/person-header.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/person-header.tsx:63"}, "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-c470738147e8c9f1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(authed)/people/people-list.tsx:609", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(authed)/people/people-list.tsx:609"}, "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-b25d2cfa4a6ea1c4", "name": "Privileged port 3 in use", "shortDescription": {"text": "Privileged port 3 in use"}, "fullDescription": {"text": "Port 3 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-bd1ad0e5c8c3dd11", "name": "Dockerfile runs as root: apps/cadence-worker/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/cadence-worker/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-e92798a74c5ae1f9", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-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-d9980d9104825b19", "name": "Dockerfile runs as root: apps/api/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/api/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-c36b30587c620ebd", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-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-a8d9e16082789b05", "name": "Dockerfile runs as root: apps/ai-worker/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/ai-worker/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-baf67258ef4733ef", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-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-115321550132004d", "name": "Dockerfile runs as root: apps/tg-worker/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/tg-worker/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-0a6ac4f60f895fe7", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-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-f2620ed8f693ce7e", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-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-64192a3c67110d01", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c777d20e3eda66e3", "name": "Very large file: apps/api/tests/test_projects.py (2244 lines)", "shortDescription": {"text": "Very large file: apps/api/tests/test_projects.py (2244 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-4f789acac2fe0289", "name": "Very large file: apps/api/tests/test_broadcasts.py (1463 lines)", "shortDescription": {"text": "Very large file: apps/api/tests/test_broadcasts.py (1463 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-42915b4fe4111e6e", "name": "Very large file: apps/api/src/pulse_api/routes/projects.py (1776 lines)", "shortDescription": {"text": "Very large file: apps/api/src/pulse_api/routes/projects.py (1776 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-6c73edb0c0482c33", "name": "Very large file: apps/api/src/pulse_api/routes/conversations.py (2148 lines)", "shortDescription": {"text": "Very large file: apps/api/src/pulse_api/routes/conversations.py (2148 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 79 placeholder/mock markers across 45 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-da178774159dfc93", "name": "Commented-code block (5 lines) in apps/cadence-worker/tests/test_embedding_backfill_cron.py:64", "shortDescription": {"text": "Commented-code block (5 lines) in apps/cadence-worker/tests/test_embedding_backfill_cron.py: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-e2fc7409d8b7c64c", "name": "Commented-code block (5 lines) in apps/cadence-worker/tests/test_daily_digest.py:87", "shortDescription": {"text": "Commented-code block (5 lines) in apps/cadence-worker/tests/test_daily_digest.py: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-6ceb85d7e37667c9", "name": "Commented-code block (9 lines) in apps/cadence-worker/src/pulse_cadence_worker/embedding_backfill_cron.py:91", "shortDescription": {"text": "Commented-code block (9 lines) in apps/cadence-worker/src/pulse_cadence_worker/embedding_backfill_cron.py: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-f462cb9a99d52b39", "name": "Legacy-named symbol `cid_old` in apps/api/tests/test_share_to_manager.py:370", "shortDescription": {"text": "Legacy-named symbol `cid_old` in apps/api/tests/test_share_to_manager.py:370"}, "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-2757c18feb47d3c9", "name": "Legacy-named symbol `acct_old` in apps/api/tests/test_projects.py:202", "shortDescription": {"text": "Legacy-named symbol `acct_old` in apps/api/tests/test_projects.py:202"}, "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-6b8b2e7816e97060", "name": "Commented-code block (6 lines) in apps/api/tests/test_projects.py:8", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/tests/test_projects.py: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-cef04328b06f1d86", "name": "Commented-code block (6 lines) in apps/api/tests/test_conversations_project_filter.py:54", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/tests/test_conversations_project_filter.py: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-2ad0a57c5e7aad04", "name": "Legacy-named symbol `acct_old` in apps/api/tests/test_broadcasts.py:154", "shortDescription": {"text": "Legacy-named symbol `acct_old` in apps/api/tests/test_broadcasts.py:154"}, "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-75a3cf320523e6f1", "name": "Commented-code block (6 lines) in apps/api/tests/test_broadcasts.py:625", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/tests/test_broadcasts.py:625"}, "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-6d41fd2ae998711c", "name": "Commented-code block (5 lines) in apps/api/tests/test_ai_catalogue.py:13", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/tests/test_ai_catalogue.py:13"}, "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-e51c404a3bd519b0", "name": "Legacy-named symbol `test_suggestions_branch_ignored_when_read_old` in apps/api/tests/test_ai_reply_suggestions.py:86", "shortDescription": {"text": "Legacy-named symbol `test_suggestions_branch_ignored_when_read_old` in apps/api/tests/test_ai_reply_suggestions.py:86"}, "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-bad10719ce9f700d", "name": "Legacy-named symbol `conversations_legacy` in apps/api/tests/test_admin_stats.py:65", "shortDescription": {"text": "Legacy-named symbol `conversations_legacy` in apps/api/tests/test_admin_stats.py:65"}, "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-0244361f1db08bfc", "name": "Legacy-named symbol `include_legacy` in apps/api/tests/test_admin_account_isolation.py:287", "shortDescription": {"text": "Legacy-named symbol `include_legacy` in apps/api/tests/test_admin_account_isolation.py:287"}, "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-cced607f240607d5", "name": "Commented-code block (5 lines) in apps/api/src/pulse_api/_acl_grants.py:56", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/_acl_grants.py: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-b328054d5968b88e", "name": "Commented-code block (8 lines) in apps/api/src/pulse_api/deps.py:13", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/pulse_api/deps.py:13"}, "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-3db4e6f3a17449f6", "name": "Commented-code block (6 lines) in apps/api/src/pulse_api/config.py:32", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/pulse_api/config.py:32"}, "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-65a9ce4b55fbea44", "name": "Commented-code block (9 lines) in apps/api/src/pulse_api/_semantic_search.py:183", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/pulse_api/_semantic_search.py:183"}, "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-d8886b3ea4a29e35", "name": "Commented-code block (11 lines) in apps/api/src/pulse_api/_contacts_acl.py:36", "shortDescription": {"text": "Commented-code block (11 lines) in apps/api/src/pulse_api/_contacts_acl.py:36"}, "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-62ee9864470c9a71", "name": "Commented-code block (5 lines) in apps/api/src/pulse_api/_cadence_read.py:77", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/_cadence_read.py: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-52756e510f17ca92", "name": "Commented-code block (9 lines) in apps/api/src/pulse_api/_accounts_acl.py:22", "shortDescription": {"text": "Commented-code block (9 lines) in apps/api/src/pulse_api/_accounts_acl.py:22"}, "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-91763586740dfe0f", "name": "Commented-code block (5 lines) in apps/api/src/pulse_api/_project_ingest.py:333", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/_project_ingest.py:333"}, "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-7208228b3b4e2f43", "name": "Commented-code block (6 lines) in apps/api/src/pulse_api/routes/projects.py:39", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/pulse_api/routes/projects.py: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-5e25edf4c8998eaf", "name": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/cadence_ai_suggest.py:170", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/cadence_ai_suggest.py:170"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7853fd9b60af7c64", "name": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/ai_models.py:69", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/ai_models.py: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-d84f226efd6b5ca1", "name": "Legacy-named symbol `include_legacy` in apps/api/src/pulse_api/routes/conversations.py:270", "shortDescription": {"text": "Legacy-named symbol `include_legacy` in apps/api/src/pulse_api/routes/conversations.py:270"}, "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-6304f175ef08338c", "name": "Commented-code block (14 lines) in apps/api/src/pulse_api/routes/conversations.py:292", "shortDescription": {"text": "Commented-code block (14 lines) in apps/api/src/pulse_api/routes/conversations.py:292"}, "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-96c1b37ee58eff49", "name": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/digest.py:42", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/digest.py:42"}, "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-d1ac7a1b2a474cba", "name": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/tasks.py:772", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/tasks.py:772"}, "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-95db1b2405bb197a", "name": "Legacy-named symbol `model_copy` in apps/api/src/pulse_api/routes/triage.py:615", "shortDescription": {"text": "Legacy-named symbol `model_copy` in apps/api/src/pulse_api/routes/triage.py:615"}, "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-5072697ddcd899dd", "name": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/triage.py:458", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/triage.py:458"}, "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-02f13c79da6b3bd8", "name": "Commented-code block (11 lines) in apps/api/src/pulse_api/routes/me.py:19", "shortDescription": {"text": "Commented-code block (11 lines) in apps/api/src/pulse_api/routes/me.py:19"}, "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-fe5f3a7fc34376b6", "name": "Legacy-named symbol `conversations_legacy` in apps/api/src/pulse_api/routes/admin_stats.py:34", "shortDescription": {"text": "Legacy-named symbol `conversations_legacy` in apps/api/src/pulse_api/routes/admin_stats.py:34"}, "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-c193f365d24547a4", "name": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/admin_invites.py:115", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/admin_invites.py:115"}, "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-2f139707bda0d172", "name": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/admin_ops.py:43", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/admin_ops.py:43"}, "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-41c0a531555b9923", "name": "Legacy-named symbol `include_legacy` in apps/api/src/pulse_api/routes/people.py:68", "shortDescription": {"text": "Legacy-named symbol `include_legacy` in apps/api/src/pulse_api/routes/people.py:68"}, "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-4409a6a458a38cab", "name": "Commented-code block (6 lines) in apps/api/src/pulse_api/routes/people.py:87", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/pulse_api/routes/people.py: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-031bb75eb1b43431", "name": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/stats.py:71", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/stats.py:71"}, "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-fb5082f7f2641e38", "name": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/broadcasts.py:87", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/broadcasts.py: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-396ffdf2037372f7", "name": "Commented-code block (8 lines) in apps/api/src/pulse_api/routes/system.py:54", "shortDescription": {"text": "Commented-code block (8 lines) in apps/api/src/pulse_api/routes/system.py: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-ce2a55b6004756af", "name": "Commented-code block (7 lines) in apps/ai-worker/tests/test_analyze.py:264", "shortDescription": {"text": "Commented-code block (7 lines) in apps/ai-worker/tests/test_analyze.py:264"}, "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-cb37053bd9c0ae0b", "name": "Commented-code block (6 lines) in apps/ai-worker/src/pulse_ai_worker/main.py:30", "shortDescription": {"text": "Commented-code block (6 lines) in apps/ai-worker/src/pulse_ai_worker/main.py: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-745e443493601682", "name": "Commented-code block (6 lines) in apps/ai-worker/src/pulse_ai_worker/tasks/analyze.py:157", "shortDescription": {"text": "Commented-code block (6 lines) in apps/ai-worker/src/pulse_ai_worker/tasks/analyze.py:157"}, "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-bed8f44c944bf59f", "name": "Commented-code block (9 lines) in apps/ai-worker/src/pulse_ai_worker/tasks/auto_feed.py:105", "shortDescription": {"text": "Commented-code block (9 lines) in apps/ai-worker/src/pulse_ai_worker/tasks/auto_feed.py:105"}, "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-393f518c2551ddb5", "name": "Legacy-named symbol `test_apply_filters_diff_binds_to_connected_not_legacy` in apps/tg-worker/tests/test_folders_pull.py", "shortDescription": {"text": "Legacy-named symbol `test_apply_filters_diff_binds_to_connected_not_legacy` in apps/tg-worker/tests/test_folders_pull.py:108"}, "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-a376afa6c19a86cd", "name": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/clients.py:54", "shortDescription": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/clients.py: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-700ee7f2ca9730ce", "name": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/backfill.py:58", "shortDescription": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/backfill.py:58"}, "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-169d22a4c9672062", "name": "Commented-code block (7 lines) in apps/tg-worker/src/pulse_tg_worker/config.py:24", "shortDescription": {"text": "Commented-code block (7 lines) in apps/tg-worker/src/pulse_tg_worker/config.py:24"}, "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-6b0995094e7291c4", "name": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/broadcast_runner.py:110", "shortDescription": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/broadcast_runner.py: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-46dbd0b70591b122", "name": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/ingest.py:281", "shortDescription": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/ingest.py:281"}, "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-18f8f5c5a4ee8cee", "name": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/handlers.py:63", "shortDescription": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/handlers.py: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-02eef8f751a25c48", "name": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/api.py:113", "shortDescription": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/api.py: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-bb7d8f2b757d0f0d", "name": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/main.py:68", "shortDescription": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/main.py: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-4580f51459d1491a", "name": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/peer_backfill.py:77", "shortDescription": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/peer_backfill.py: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-78c8aaa900d1d8b6", "name": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/folders.py:22", "shortDescription": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/folders.py:22"}, "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-5d0239cb7363a998", "name": "Commented-code block (7 lines) in apps/web/auth.ts:10", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/auth.ts:10"}, "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-4979d32e053806b9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/account-switcher.tsx:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/account-switcher.tsx:19"}, "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-f4f453b464481b29", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/app-sidebar.tsx:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/app-sidebar.tsx:34"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c444a3643d5016c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/mobile-nav.tsx:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/mobile-nav.tsx:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ea8b97c87a06ccb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/digest-settings-card.tsx:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/digest-settings-card.tsx:23"}, "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-2da2bc1ccad5e2ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/my-tg-accounts.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/my-tg-accounts.tsx:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-47e062a1465a740f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/preferences-card.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/preferences-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-3bbee724495aba07", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/my-budget-card.tsx:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/my-budget-card.tsx:26"}, "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-cc27e5eae0017218", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/ai-limits-card.tsx:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/ai-limits-card.tsx:63"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f9d059abb0acbd36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/shared-contacts-card.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/shared-contacts-card.tsx:32"}, "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-80a25f936a18ac06", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/profile-card.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/profile-card.tsx:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd2e7dba8401f47d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/llm-routes-card.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/llm-routes-card.tsx:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-88ab1014c1368d0a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/notifications/notifications-bell.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/notifications/notifications-bell.tsx:21"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5b57ecdec25e2500", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/notifications/notifications-inbox.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/notifications/notifications-inbox.tsx:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d0c8633774d5b6ef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/i18n/language-toggle.tsx:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/i18n/language-toggle.tsx:16"}, "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-aafc73144d15e701", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/draft-dialog.tsx:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/draft-dialog.tsx:159"}, "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-65229dc55ecadd9f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/project-starter-picker.tsx:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/project-starter-picker.tsx:19"}, "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-8f4aa4d1f4cae74f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/new-project-dialog.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/new-project-dialog.tsx:39"}, "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-06e4b2a83f422099", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/members-table.tsx:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/members-table.tsx:102"}, "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-418d12464c70eca0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/cadence-state-panel.tsx:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/cadence-state-panel.tsx:43"}, "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-c2187ade1b2757df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/bulk-add-popover.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/bulk-add-popover.tsx:37"}, "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-d59a3ea520409e79", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/managers-panel.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/managers-panel.tsx:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c2925d83f13da7b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/pitch-editor.tsx:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/pitch-editor.tsx: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-4cc3281cf556fafa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/curate-panel.tsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/curate-panel.tsx:81"}, "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-c0b78b254906df9b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/project-header.tsx:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/project-header.tsx:39"}, "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-4e2eebf13d42d4b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/goal-editor.tsx:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/goal-editor.tsx: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-a0ec04c36052820e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/stat-strip.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/stat-strip.tsx:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc1379b69535afe8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/next-actions-card.tsx:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/next-actions-card.tsx:30"}, "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-0466388656449f75", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/hidden-triage-list.tsx:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/hidden-triage-list.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-c29f40d1913831b5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/onboarding-checklist.tsx:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/onboarding-checklist.tsx:28"}, "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-04cce681ca90a27a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/shared-with-you-card.tsx:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/shared-with-you-card.tsx:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1a3047922632f23b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/use-triage-counts.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/use-triage-counts.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-fbf0596495e1f745", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/backfill-progress.tsx:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/backfill-progress.tsx:19"}, "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-f407a7bdff0891bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/triage-queue-card.tsx:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/triage-queue-card.tsx:101"}, "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-06dfd0d8e116e519", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/my-day-card.tsx:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/my-day-card.tsx:38"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5dd75b5d87db7d0a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/chats-freshness.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/chats-freshness.tsx:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a96bf3a59c8b41b", "name": "Commented-code block (5 lines) in apps/web/components/chats/reply-window.tsx:517", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/chats/reply-window.tsx:517"}, "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-6d10269e0043bf73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/reply-window.tsx:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/reply-window.tsx:83"}, "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-9b90a5156bda2a20", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/shared-by-chips.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/shared-by-chips.tsx:24"}, "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-bffc836d44d07ec8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/topics-tab.tsx:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/topics-tab.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-0eee536b3c841b60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/add-folder-to-project-dialog.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/add-folder-to-project-dialog.tsx:32"}, "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-3466ac80ccc740dd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/TopicsList.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/TopicsList.tsx:24"}, "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-98430a5f0ebbd455", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/peek-panel.tsx:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/peek-panel.tsx:89"}, "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-e1a60032a38361ef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/OwnerControl.tsx:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/OwnerControl.tsx:9"}, "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-6974a7808d21d6ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/project-chips.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/project-chips.tsx:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-691a519168b00783", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/share-contact-dialog.tsx:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/share-contact-dialog.tsx:36"}, "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-0ede83ce54ca0b3a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/add-chat-dialog.tsx:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/add-chat-dialog.tsx:38"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-266688a278349133", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/sender-account-picker.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/sender-account-picker.tsx:21"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac7dc33646e1ca3b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/sender-badge.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/sender-badge.tsx:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-503e7430df8c2d36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/folder-chips.tsx:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/folder-chips.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-dca48d30a2910af1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/folder-members-dialog.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/folder-members-dialog.tsx:24"}, "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-b1a1f1a86903abf6", "name": "Commented-code block (5 lines) in apps/web/components/chats/ai-summary-card.tsx:44", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/chats/ai-summary-card.tsx:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec9c1ad79af55a9c", "name": "Commented-code block (5 lines) in apps/web/components/chats/chat-row.tsx:127", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/chats/chat-row.tsx: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-42156de82a3fcb1b", "name": "Commented-code block (5 lines) in apps/web/components/cadence-wizard/linear-detect.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/cadence-wizard/linear-detect.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e982d44f57426fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/cadence-wizard/mode-tabs.tsx:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/cadence-wizard/mode-tabs.tsx: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-76a4c88d7c29f7a0", "name": "Commented-code block (5 lines) in apps/web/components/tasks/tasks-list.tsx:119", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/tasks/tasks-list.tsx:119"}, "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-3d824bc41d6ffba6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/tasks-list.tsx:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/tasks-list.tsx:84"}, "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-2e51aeeca357e997", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/tasks-stats.tsx:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/tasks-stats.tsx:17"}, "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-1d886af84c55e9fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/new-task-dialog.tsx:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/new-task-dialog.tsx: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-ffda0e52bbcbc105", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/__tests__/new-task-dialog-contact.test.tsx:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/__tests__/new-task-dialog-contact.test.tsx:108"}, "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-f8c4c4eb60ce8dfb", "name": "Commented-code block (7 lines) in apps/web/components/tasks/__tests__/tasks-lifecycle.test.tsx:151", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/components/tasks/__tests__/tasks-lifecycle.test.tsx:151"}, "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-7ce5406cabf9d12e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/__tests__/tasks-lifecycle.test.tsx:140", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/__tests__/tasks-lifecycle.test.tsx:140"}, "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-4f1619f1fd874cba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/InvitesList.tsx:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/InvitesList.tsx:34"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea3d9230180f747c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/IngestDashboard.tsx:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/IngestDashboard.tsx:46"}, "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-cab6ec4ec038c3d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/GrantsOverview.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/GrantsOverview.tsx:53"}, "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-2c39e6d436aa1481", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/TGAccountList.tsx:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/TGAccountList.tsx:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5321fa5f794640b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/UserList.tsx:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/UserList.tsx:36"}, "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-beae04c6cd8bb4fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/ScopeAccessPanel.tsx:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/ScopeAccessPanel.tsx:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a23c222965c2b440", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/me-grants/me-grants-client.tsx:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/me-grants/me-grants-client.tsx:38"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28db385198034d5d", "name": "Commented-code block (5 lines) in apps/web/components/broadcasts/create-broadcast-dialog.tsx:126", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/broadcasts/create-broadcast-dialog.tsx:126"}, "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-954b6b0f170edd08", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/broadcasts/create-broadcast-dialog.tsx:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/broadcasts/create-broadcast-dialog.tsx:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-56cd8a4941c037b2", "name": "Commented-code block (6 lines) in apps/web/components/broadcasts/broadcasts-list.tsx:36", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/components/broadcasts/broadcasts-list.tsx:36"}, "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-5cafc8846f3ebb1e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/broadcasts/broadcasts-list.tsx:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/broadcasts/broadcasts-list.tsx:28"}, "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-9d48370a490511ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/broadcasts/broadcast-detail.tsx:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/broadcasts/broadcast-detail.tsx:33"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43bb8b16a841a5f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/cadences/CadenceEditor.tsx:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/cadences/CadenceEditor.tsx:61"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-132a0eb1b835ed53", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/people/similar-tab-lazy.tsx:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/people/similar-tab-lazy.tsx:19"}, "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-e0fab46539190269", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/people/project-chip-remove.tsx:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/people/project-chip-remove.tsx:26"}, "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-75ba35fee08e3f84", "name": "Commented-code block (5 lines) in apps/web/components/people/__tests__/people-list.test.tsx:371", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/people/__tests__/people-list.test.tsx:371"}, "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-54635df138af7f04", "name": "Commented-code block (5 lines) in apps/web/app/(authed)/projects/[id]/page.tsx:102", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/projects/[id]/page.tsx:102"}, "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-b9dd29d51c7e7790", "name": "Commented-code block (5 lines) in apps/web/app/(authed)/chats/page.tsx:33", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/chats/page.tsx:33"}, "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-eaca567a4d1c635a", "name": "Commented-code block (5 lines) in apps/web/app/(authed)/chats/chats-list.tsx:103", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/chats/chats-list.tsx: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-98fe47fc5c511061", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(authed)/chats/chats-list.tsx:288", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(authed)/chats/chats-list.tsx:288"}, "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-ce4bee67a3b9af39", "name": "Legacy-named symbol `conversations_legacy` in apps/web/app/(authed)/admin/page.tsx:27", "shortDescription": {"text": "Legacy-named symbol `conversations_legacy` in apps/web/app/(authed)/admin/page.tsx:27"}, "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-27b9c608ddfbdcf7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(authed)/admin/page.tsx:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(authed)/admin/page.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-9f9c85c3e5325f51", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(authed)/admin/folders/page.tsx:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(authed)/admin/folders/page.tsx:34"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5bf687e4acdd97a8", "name": "Commented-code block (5 lines) in apps/web/app/(authed)/people/people-list.tsx:231", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/people/people-list.tsx:231"}, "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-3a29b1b6c61948b0", "name": "Commented-code block (5 lines) in apps/web/app/(authed)/people/[id]/page.tsx:75", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/people/[id]/page.tsx:75"}, "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-1e16ad9e447f3078", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/api.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/api.ts:15"}, "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-d9d2c42ec4b9d13a", "name": "Commented-code block (9 lines) in packages/db/src/pulse_db/lead_status.py:41", "shortDescription": {"text": "Commented-code block (9 lines) in packages/db/src/pulse_db/lead_status.py:41"}, "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-b96934ad3dd11540", "name": "Commented-code block (5 lines) in packages/db/src/pulse_db/acl.py:48", "shortDescription": {"text": "Commented-code block (5 lines) in packages/db/src/pulse_db/acl.py:48"}, "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-a87842d5b588a927", "name": "Commented-code block (6 lines) in packages/db/src/pulse_db/cadence_engine.py:277", "shortDescription": {"text": "Commented-code block (6 lines) in packages/db/src/pulse_db/cadence_engine.py:277"}, "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-8ef2b029a8404310", "name": "Commented-code block (5 lines) in packages/db/src/pulse_db/models/broadcast.py:100", "shortDescription": {"text": "Commented-code block (5 lines) in packages/db/src/pulse_db/models/broadcast.py: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-2719c6c27cf47838", "name": "Legacy-named symbol `include_legacy` in packages/db/src/pulse_db/migrations/versions/0021_conversation_per_account.py:10", "shortDescription": {"text": "Legacy-named symbol `include_legacy` in packages/db/src/pulse_db/migrations/versions/0021_conversation_per_account.py:10"}, "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-69ad84ff4b78e329", "name": "Commented-code block (5 lines) in packages/db/src/pulse_db/migrations/versions/0010_conversations_people_split.py:57", "shortDescription": {"text": "Commented-code block (5 lines) in packages/db/src/pulse_db/migrations/versions/0010_conversations_people_split.py: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-814e286b5991c316", "name": "Commented-code block (9 lines) in packages/schemas/src/pulse_schemas/project.py:60", "shortDescription": {"text": "Commented-code block (9 lines) in packages/schemas/src/pulse_schemas/project.py:60"}, "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-2d6816719f216cb8", "name": "Commented-code block (5 lines) in packages/llm/tests/test_route_resolver.py:24", "shortDescription": {"text": "Commented-code block (5 lines) in packages/llm/tests/test_route_resolver.py:24"}, "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-7d27d1cd976c783a", "name": "Commented-code block (7 lines) in packages/llm/src/pulse_llm/reply_drafts.py:250", "shortDescription": {"text": "Commented-code block (7 lines) in packages/llm/src/pulse_llm/reply_drafts.py:250"}, "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-c82a3d16b883aecb", "name": "Commented-code block (5 lines) in packages/llm/src/pulse_llm/runs.py:27", "shortDescription": {"text": "Commented-code block (5 lines) in packages/llm/src/pulse_llm/runs.py: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-0744b0dfc312f8d4", "name": "Commented-code block (5 lines) in packages/llm/src/pulse_llm/routes.py:92", "shortDescription": {"text": "Commented-code block (5 lines) in packages/llm/src/pulse_llm/routes.py:92"}, "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-380b073ef1bd1c04", "name": "Commented-code block (5 lines) in packages/llm/src/pulse_llm/conversation_summary.py:132", "shortDescription": {"text": "Commented-code block (5 lines) in packages/llm/src/pulse_llm/conversation_summary.py:132"}, "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-3482f7e5dd70cd1a", "name": "6 env vars used in code but missing from .env.example", "shortDescription": {"text": "6 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AUTH_ALLOWED_DOMAINS`, `AUTH_SECRET`, `NODE_ENV`, `PULSE_API_BASE_URL`, `PULSE_E2E_BASE_URL`, `TG_WORKER_URL`. 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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napps/cadence-worker/src/pulse_cadence_worker/config.py:get_settings, apps/api/src/pulse_api/config.py:get_settings, apps/ai-worker/src/pulse_ai_worker/config.py:get_settings, apps/tg-worker/src/pulse_tg_worker/config.py:get_settings\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napps/cadence-worker/src/pulse_cadence_worker/main.py:startup, apps/ai-worker/src/pulse_ai_worker/main.py:startup\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napps/api/src/pulse_api/routes/broadcasts.py:start_broadcast, apps/api/src/pulse_api/routes/broadcasts.py:pause_broadcast, apps/api/src/pulse_api/routes/broadcasts.py:cancel_broadcast\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-acb123bf8476f828", "name": "FastAPI POST `registry_refresh` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:160", "shortDescription": {"text": "FastAPI POST `registry_refresh` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:160"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08a72cf35a82b925", "name": "FastAPI POST `backfill_conversation` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:190", "shortDescription": {"text": "FastAPI POST `backfill_conversation` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:190"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-69c0ac0ac2e61ff3", "name": "FastAPI POST `sync_dialogs` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:247", "shortDescription": {"text": "FastAPI POST `sync_dialogs` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:247"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-935754997309138d", "name": "FastAPI POST `send` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:302", "shortDescription": {"text": "FastAPI POST `send` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:302"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d21d2b119417b7ba", "name": "FastAPI POST `folders_delete` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:352", "shortDescription": {"text": "FastAPI POST `folders_delete` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:352"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa0f127f33d11c15", "name": "FastAPI POST `folders_resync` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:370", "shortDescription": {"text": "FastAPI POST `folders_resync` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:370"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-121123aa20e4e492", "name": "FastAPI POST `folders_force_scan` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:389", "shortDescription": {"text": "FastAPI POST `folders_force_scan` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:389"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d8f7f7d3fc4057ef", "name": "FastAPI POST `folders_sync_to_tg` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:409", "shortDescription": {"text": "FastAPI POST `folders_sync_to_tg` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:409"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc5e0c68d11b479a", "name": "FastAPI POST `ingest_person_dm` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:428", "shortDescription": {"text": "FastAPI POST `ingest_person_dm` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:428"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df09d354c21d5fde", "name": "FastAPI POST `ingest_person_dms` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:470", "shortDescription": {"text": "FastAPI POST `ingest_person_dms` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:470"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-122637260b4d6f35", "name": "Dangling fetch: POST /api/active-account (apps/web/components/account-switcher.tsx:75)", "shortDescription": {"text": "Dangling fetch: POST /api/active-account (apps/web/components/account-switcher.tsx:75)"}, "fullDescription": {"text": "`apps/web/components/account-switcher.tsx:75` calls `POST /api/active-account` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/active-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-005482af6bc79ca1", "name": "Dangling fetch: PUT /api/me/prefs/ai_budget_cap_usd (apps/web/components/settings/my-budget-card.tsx:70)", "shortDescription": {"text": "Dangling fetch: PUT /api/me/prefs/ai_budget_cap_usd (apps/web/components/settings/my-budget-card.tsx:70)"}, "fullDescription": {"text": "`apps/web/components/settings/my-budget-card.tsx:70` calls `PUT /api/me/prefs/ai_budget_cap_usd` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/prefs/ai_budget_cap_usd`\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-0c04d4b0a07192d2", "name": "Dangling fetch: PUT /api/me/prefs/language (apps/web/components/i18n/language-toggle.tsx:16)", "shortDescription": {"text": "Dangling fetch: PUT /api/me/prefs/language (apps/web/components/i18n/language-toggle.tsx:16)"}, "fullDescription": {"text": "`apps/web/components/i18n/language-toggle.tsx:16` calls `PUT /api/me/prefs/language` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/prefs/language`\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-7679e335315efa84", "name": "Dangling fetch: POST /api/projects/${projectId}/members/${personId}/cadence/${action} (apps/web/components/projects/cade", "shortDescription": {"text": "Dangling fetch: POST /api/projects/${projectId}/members/${personId}/cadence/${action} (apps/web/components/projects/cadence-state-panel.tsx:68)"}, "fullDescription": {"text": "`apps/web/components/projects/cadence-state-panel.tsx:68` calls `POST /api/projects/${projectId}/members/${personId}/cadence/${action}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/projects/<p>/members/<p>/cadence/<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-13f37bb110a3b4e6", "name": "Dangling fetch: PUT /api/me/prefs/onboarding_dismissed (apps/web/components/dashboard/onboarding-checklist.tsx:53)", "shortDescription": {"text": "Dangling fetch: PUT /api/me/prefs/onboarding_dismissed (apps/web/components/dashboard/onboarding-checklist.tsx:53)"}, "fullDescription": {"text": "`apps/web/components/dashboard/onboarding-checklist.tsx:53` calls `PUT /api/me/prefs/onboarding_dismissed` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/prefs/onboarding_dismissed`\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-f1506d9986687773", "name": "Dangling fetch: GET /api/me/prefs/auto_advance_chats (apps/web/components/chats/reply-window.tsx:296)", "shortDescription": {"text": "Dangling fetch: GET /api/me/prefs/auto_advance_chats (apps/web/components/chats/reply-window.tsx:296)"}, "fullDescription": {"text": "`apps/web/components/chats/reply-window.tsx:296` calls `GET /api/me/prefs/auto_advance_chats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/prefs/auto_advance_chats`\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-64cd50caa9e3c933", "name": "Dangling fetch: POST /api/admin/ingest/accounts/${a.id}/backfill/${verb} (apps/web/components/admin/IngestDashboard.tsx:", "shortDescription": {"text": "Dangling fetch: POST /api/admin/ingest/accounts/${a.id}/backfill/${verb} (apps/web/components/admin/IngestDashboard.tsx:115)"}, "fullDescription": {"text": "`apps/web/components/admin/IngestDashboard.tsx:115` calls `POST /api/admin/ingest/accounts/${a.id}/backfill/${verb}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/ingest/accounts/<p>/backfill/<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-1b6aeedd55cb82b8", "name": "Dangling fetch: POST /api/broadcasts/${id}/${kind} (apps/web/components/broadcasts/broadcast-detail.tsx:111)", "shortDescription": {"text": "Dangling fetch: POST /api/broadcasts/${id}/${kind} (apps/web/components/broadcasts/broadcast-detail.tsx:111)"}, "fullDescription": {"text": "`apps/web/components/broadcasts/broadcast-detail.tsx:111` calls `POST /api/broadcasts/${id}/${kind}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/broadcasts/<p>/<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-b3da7f9b34e686d6", "name": "Unused endpoint: GET /admin/tg-accounts", "shortDescription": {"text": "Unused endpoint: GET /admin/tg-accounts"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_tg.py` declares `GET /admin/tg-accounts` 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-14c93f779cdf408c", "name": "Unused endpoint: POST /admin/tg-accounts/start", "shortDescription": {"text": "Unused endpoint: POST /admin/tg-accounts/start"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_tg.py` declares `POST /admin/tg-accounts/start` 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-ca6c3ce13188b0e9", "name": "Unused endpoint: POST /admin/tg-accounts/complete", "shortDescription": {"text": "Unused endpoint: POST /admin/tg-accounts/complete"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_tg.py` declares `POST /admin/tg-accounts/complete` 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-28e07aadb481bf52", "name": "Unused endpoint: POST /admin/tg-accounts/import", "shortDescription": {"text": "Unused endpoint: POST /admin/tg-accounts/import"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_tg.py` declares `POST /admin/tg-accounts/import` 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-ca8bdb1990003844", "name": "Unused endpoint: GET /projects/starters", "shortDescription": {"text": "Unused endpoint: GET /projects/starters"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/projects.py` declares `GET /projects/starters` 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-8276e9a42f5cb13a", "name": "Unused endpoint: GET /projects/{project_id}", "shortDescription": {"text": "Unused endpoint: GET /projects/{project_id}"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/projects.py` declares `GET /projects/{project_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-deb769b9b73d9d9a", "name": "Unused endpoint: POST /projects/{project_id}/members/{person_id}/draft", "shortDescription": {"text": "Unused endpoint: POST /projects/{project_id}/members/{person_id}/draft"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/projects.py` declares `POST /projects/{project_id}/members/{person_id}/draft` 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-fb2696c6d7d57c46", "name": "Unused endpoint: GET /admin/tg-accounts/{account_id}/access", "shortDescription": {"text": "Unused endpoint: GET /admin/tg-accounts/{account_id}/access"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_account_acl.py` declares `GET /admin/tg-accounts/{account_id}/access` 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-d6d99da1d63def92", "name": "Unused endpoint: POST /admin/tg-accounts/{account_id}/access", "shortDescription": {"text": "Unused endpoint: POST /admin/tg-accounts/{account_id}/access"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_account_acl.py` declares `POST /admin/tg-accounts/{account_id}/access` 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-de19a6915c03a660", "name": "Unused endpoint: POST /admin/tg-accounts/{account_id}/access/bulk", "shortDescription": {"text": "Unused endpoint: POST /admin/tg-accounts/{account_id}/access/bulk"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_account_acl.py` declares `POST /admin/tg-accounts/{account_id}/access/bulk` 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-c1cd8e10a2ba4f80", "name": "Unused endpoint: DELETE /admin/tg-accounts/{account_id}/access/{user_id}", "shortDescription": {"text": "Unused endpoint: DELETE /admin/tg-accounts/{account_id}/access/{user_id}"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_account_acl.py` declares `DELETE /admin/tg-accounts/{account_id}/access/{user_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-89dfa27bb779667f", "name": "Unused endpoint: GET /limits/usage", "shortDescription": {"text": "Unused endpoint: GET /limits/usage"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/limits.py` declares `GET /limits/usage` 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-071e5e39d226a0e1", "name": "Unused endpoint: GET /admin/folders/{folder_id}/access", "shortDescription": {"text": "Unused endpoint: GET /admin/folders/{folder_id}/access"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_folder_acl.py` declares `GET /admin/folders/{folder_id}/access` 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-22af08ca76b25231", "name": "Unused endpoint: POST /admin/folders/{folder_id}/access", "shortDescription": {"text": "Unused endpoint: POST /admin/folders/{folder_id}/access"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_folder_acl.py` declares `POST /admin/folders/{folder_id}/access` 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-9745b1da7fae4097", "name": "Unused endpoint: POST /admin/folders/{folder_id}/access/bulk", "shortDescription": {"text": "Unused endpoint: POST /admin/folders/{folder_id}/access/bulk"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_folder_acl.py` declares `POST /admin/folders/{folder_id}/access/bulk` 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-8b7d0d836aae2102", "name": "Unused endpoint: DELETE /admin/folders/{folder_id}/access/{user_id}", "shortDescription": {"text": "Unused endpoint: DELETE /admin/folders/{folder_id}/access/{user_id}"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_folder_acl.py` declares `DELETE /admin/folders/{folder_id}/access/{user_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-a7013fe53d49658f", "name": "Unused endpoint: GET /admin/people/{person_id}/access", "shortDescription": {"text": "Unused endpoint: GET /admin/people/{person_id}/access"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_people_acl.py` declares `GET /admin/people/{person_id}/access` 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-475d1867764701ba", "name": "Unused endpoint: POST /admin/people/{person_id}/access", "shortDescription": {"text": "Unused endpoint: POST /admin/people/{person_id}/access"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_people_acl.py` declares `POST /admin/people/{person_id}/access` 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-347df7edea354edd", "name": "Unused endpoint: DELETE /admin/people/{person_id}/access/{user_id}", "shortDescription": {"text": "Unused endpoint: DELETE /admin/people/{person_id}/access/{user_id}"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_people_acl.py` declares `DELETE /admin/people/{person_id}/access/{user_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-1119b37cf9dcbe55", "name": "Unused endpoint: GET /admin/org-settings", "shortDescription": {"text": "Unused endpoint: GET /admin/org-settings"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/org_settings.py` declares `GET /admin/org-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-3b06433c5e3b1f45", "name": "Unused endpoint: GET /me/tg-accounts", "shortDescription": {"text": "Unused endpoint: GET /me/tg-accounts"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/me_tg.py` declares `GET /me/tg-accounts` 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-54d75d84e59c5354", "name": "Unused endpoint: GET /me/tg-accounts/mine", "shortDescription": {"text": "Unused endpoint: GET /me/tg-accounts/mine"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/me_tg.py` declares `GET /me/tg-accounts/mine` 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-8d1c0d1393e8e3ca", "name": "Unused endpoint: POST /me/tg-accounts/start", "shortDescription": {"text": "Unused endpoint: POST /me/tg-accounts/start"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/me_tg.py` declares `POST /me/tg-accounts/start` 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-acf4e6729f438e64", "name": "Unused endpoint: POST /me/tg-accounts/complete", "shortDescription": {"text": "Unused endpoint: POST /me/tg-accounts/complete"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/me_tg.py` declares `POST /me/tg-accounts/complete` 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-6327e7d63f12d827", "name": "Unused endpoint: GET /contacts", "shortDescription": {"text": "Unused endpoint: GET /contacts"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/legacy.py` declares `GET /contacts` 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-14298e77527b7350", "name": "Unused endpoint: GET /contacts/search", "shortDescription": {"text": "Unused endpoint: GET /contacts/search"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/legacy.py` declares `GET /contacts/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-c03a22ce5bc1852c", "name": "Unused endpoint: GET /contacts/{contact_id}", "shortDescription": {"text": "Unused endpoint: GET /contacts/{contact_id}"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/legacy.py` declares `GET /contacts/{contact_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-2888db7d2e5263c1", "name": "Unused endpoint: GET /ai/catalogue", "shortDescription": {"text": "Unused endpoint: GET /ai/catalogue"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/ai_models.py` declares `GET /ai/catalogue` 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-328e124dd270b043", "name": "Unused endpoint: GET /ai/routes", "shortDescription": {"text": "Unused endpoint: GET /ai/routes"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/ai_models.py` declares `GET /ai/routes` 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-0db4ad88900d68ac", "name": "Unused endpoint: GET /dashboard/next-actions", "shortDescription": {"text": "Unused endpoint: GET /dashboard/next-actions"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/dashboard.py` declares `GET /dashboard/next-actions` 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-cdfddec1bc196588", "name": "Unused endpoint: POST /conversations/sync", "shortDescription": {"text": "Unused endpoint: POST /conversations/sync"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/conversations.py` declares `POST /conversations/sync` 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-b9de5418a1c08e9a", "name": "Unused endpoint: POST /conversations/{conversation_id}/summarize", "shortDescription": {"text": "Unused endpoint: POST /conversations/{conversation_id}/summarize"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/conversations.py` declares `POST /conversations/{conversation_id}/summarize` 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-7fac25f11f5b4cd5", "name": "Unused endpoint: GET /conversations/{conversation_id}/attachments/{attachment_id}", "shortDescription": {"text": "Unused endpoint: GET /conversations/{conversation_id}/attachments/{attachment_id}"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/conversations.py` declares `GET /conversations/{conversation_id}/attachments/{attachment_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-480e46fcd71f652a", "name": "Unused endpoint: GET /conversations/{conversation_id}/members", "shortDescription": {"text": "Unused endpoint: GET /conversations/{conversation_id}/members"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/conversations.py` declares `GET /conversations/{conversation_id}/members` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37dcfe85640bc76d", "name": "Unused endpoint: GET /conversations/{conversation_id}/topics", "shortDescription": {"text": "Unused endpoint: GET /conversations/{conversation_id}/topics"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/conversations.py` declares `GET /conversations/{conversation_id}/topics` 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-e564e6b2d07ea75e", "name": "Unused endpoint: GET /admin/conversations/{conversation_id}/access", "shortDescription": {"text": "Unused endpoint: GET /admin/conversations/{conversation_id}/access"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_acl.py` declares `GET /admin/conversations/{conversation_id}/access` 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-8d608d14eed654dc", "name": "Unused endpoint: POST /admin/conversations/{conversation_id}/access", "shortDescription": {"text": "Unused endpoint: POST /admin/conversations/{conversation_id}/access"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_acl.py` declares `POST /admin/conversations/{conversation_id}/access` 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-259b15b1a71d5061", "name": "Unused endpoint: POST /admin/conversations/{conversation_id}/access/bulk", "shortDescription": {"text": "Unused endpoint: POST /admin/conversations/{conversation_id}/access/bulk"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_acl.py` declares `POST /admin/conversations/{conversation_id}/access/bulk` 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-0c4f5fac237934ec", "name": "Unused endpoint: DELETE /admin/conversations/{conversation_id}/access/{user_id}", "shortDescription": {"text": "Unused endpoint: DELETE /admin/conversations/{conversation_id}/access/{user_id}"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/admin_acl.py` declares `DELETE /admin/conversations/{conversation_id}/access/{user_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-060f5b37ce1343c6", "name": "Unused endpoint: GET /conversations/{conversation_id}/summary", "shortDescription": {"text": "Unused endpoint: GET /conversations/{conversation_id}/summary"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/summaries.py` declares `GET /conversations/{conversation_id}/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-cc3887ecd92805a4", "name": "Unused endpoint: GET /digest/today", "shortDescription": {"text": "Unused endpoint: GET /digest/today"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/digest.py` declares `GET /digest/today` 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-cc6f248c116df03d", "name": "Unused endpoint: GET /cadence/starters", "shortDescription": {"text": "Unused endpoint: GET /cadence/starters"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/cadences.py` declares `GET /cadence/starters` 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-8e8709b459c2d420", "name": "Unused endpoint: POST /projects/{project_id}/cadence/lint", "shortDescription": {"text": "Unused endpoint: POST /projects/{project_id}/cadence/lint"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/cadences.py` declares `POST /projects/{project_id}/cadence/lint` 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-98220e6989d2ec27", "name": "Unused endpoint: POST /projects/{project_id}/members/{person_id}/cadence/start", "shortDescription": {"text": "Unused endpoint: POST /projects/{project_id}/members/{person_id}/cadence/start"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/cadences.py` declares `POST /projects/{project_id}/members/{person_id}/cadence/start` 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-7f68e2f172849a9f", "name": "Unused endpoint: POST /projects/{project_id}/members/{person_id}/cadence/pause", "shortDescription": {"text": "Unused endpoint: POST /projects/{project_id}/members/{person_id}/cadence/pause"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/cadences.py` declares `POST /projects/{project_id}/members/{person_id}/cadence/pause` 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-34ab21e63a0a5e9e", "name": "Unused endpoint: GET /projects/{project_id}/cadence/state", "shortDescription": {"text": "Unused endpoint: GET /projects/{project_id}/cadence/state"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/cadences.py` declares `GET /projects/{project_id}/cadence/state` 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-7db669e94f66c8b5", "name": "Unused endpoint: GET /projects/{project_id}/cadence/transitions", "shortDescription": {"text": "Unused endpoint: GET /projects/{project_id}/cadence/transitions"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/cadences.py` declares `GET /projects/{project_id}/cadence/transitions` 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-fd0e06afbaab19b3", "name": "Unused endpoint: GET /tasks", "shortDescription": {"text": "Unused endpoint: GET /tasks"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/tasks.py` declares `GET /tasks` 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-78d4d9ba50d6c996", "name": "Unused endpoint: GET /tasks/count", "shortDescription": {"text": "Unused endpoint: GET /tasks/count"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/tasks.py` declares `GET /tasks/count` 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-af452444bd69963c", "name": "Unused endpoint: GET /tasks/stats", "shortDescription": {"text": "Unused endpoint: GET /tasks/stats"}, "fullDescription": {"text": "`apps/api/src/pulse_api/routes/tasks.py` declares `GET /tasks/stats` 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/23744"}, "properties": {"repository": "zurabest/pulse", "repoUrl": "https://github.com/zurabest/pulse", "branch": "main"}, "results": [{"ruleId": "scanner-570a015bb233521e", "level": "note", "message": {"text": "Possibly dead Python function: startup"}, "properties": {"repobilityId": "2cdbcf88b35eabc7", "scanner": "scanner-primary", "fingerprint": "570a015bb233521e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/cadence-worker/src/pulse_cadence_worker/main.py:13"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5bbebfb3f955a5a8", "level": "note", "message": {"text": "Possibly dead Python function: db_session"}, "properties": {"repobilityId": "13dd19e96fa0ff1e", "scanner": "scanner-primary", "fingerprint": "5bbebfb3f955a5a8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/pulse_api/deps.py:44"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c9d1081575d1d074", "level": "note", "message": {"text": "Possibly dead Python function: current_user"}, "properties": {"repobilityId": "271089411e6e6afb", "scanner": "scanner-primary", "fingerprint": "c9d1081575d1d074", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/pulse_api/deps.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0d9604787c7da781", "level": "note", "message": {"text": "Possibly dead Python function: require_admin"}, "properties": {"repobilityId": "3c06db2e25566bf7", "scanner": "scanner-primary", "fingerprint": "0d9604787c7da781", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/pulse_api/deps.py:56"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c54a72899507ce93", "level": "note", "message": {"text": "Possibly dead Python function: capture_meta"}, "properties": {"repobilityId": "839f6ec5818dc4ef", "scanner": "scanner-primary", "fingerprint": "c54a72899507ce93", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/src/pulse_api/routes/conversations.py:1535"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1f6b16e453e6cf98", "level": "note", "message": {"text": "Possibly dead Python function: startup"}, "properties": {"repobilityId": "2cdbcf88b35eabc7", "scanner": "scanner-primary", "fingerprint": "1f6b16e453e6cf98", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ai-worker/src/pulse_ai_worker/main.py:15"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-958ad4c3b30a4531", "level": "note", "message": {"text": "Possibly dead Python function: run_poll_loop"}, "properties": {"repobilityId": "0cebc5c2c15476c6", "scanner": "scanner-primary", "fingerprint": "958ad4c3b30a4531", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/clients.py:116"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-35c5d6047f3bd771", "level": "note", "message": {"text": "Possibly dead Python function: sync_folder_to_tg"}, "properties": {"repobilityId": "d0e3c401a3ff533c", "scanner": "scanner-primary", "fingerprint": "35c5d6047f3bd771", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/folders.py:636"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-56dcb5d145a7bc5e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/command-palette.tsx:318"}, "properties": {"repobilityId": "9cc66192db9112f2", "scanner": "scanner-primary", "fingerprint": "56dcb5d145a7bc5e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b49799c3c7cfd9f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/account-switcher.tsx:96"}, "properties": {"repobilityId": "d133908a3c0eb4b1", "scanner": "scanner-primary", "fingerprint": "8b49799c3c7cfd9f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57f3a1a81d066ec5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/user-menu.tsx:25"}, "properties": {"repobilityId": "f0cc1f39f9c9c44d", "scanner": "scanner-primary", "fingerprint": "57f3a1a81d066ec5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8edb3b8d0937cea1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/settings/my-tg-accounts.tsx:55"}, "properties": {"repobilityId": "dcef8faab4f922cf", "scanner": "scanner-primary", "fingerprint": "8edb3b8d0937cea1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5c1377055e7f8cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/settings/ai-limits-card.tsx:392"}, "properties": {"repobilityId": "ace5f2514fb32436", "scanner": "scanner-primary", "fingerprint": "a5c1377055e7f8cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f2435a6ef28fb8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/settings/shared-contacts-card.tsx:85"}, "properties": {"repobilityId": "642cd546af3fbc68", "scanner": "scanner-primary", "fingerprint": "9f2435a6ef28fb8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6462e5938cc7e404", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/help/help-toc.tsx:57"}, "properties": {"repobilityId": "50467157de74bea6", "scanner": "scanner-primary", "fingerprint": "6462e5938cc7e404", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8896f90f7aeafa06", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/notifications/notifications-list.tsx:68"}, "properties": {"repobilityId": "d1ae9ab3b7c94883", "scanner": "scanner-primary", "fingerprint": "8896f90f7aeafa06", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c50e4efa5f77cd9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/draft-dialog.tsx:499"}, "properties": {"repobilityId": "6b7050a513f99d09", "scanner": "scanner-primary", "fingerprint": "3c50e4efa5f77cd9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-740bc27e137c25d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/members-table.tsx:414"}, "properties": {"repobilityId": "6506bb2a840bc796", "scanner": "scanner-primary", "fingerprint": "740bc27e137c25d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-08c6fa910947a69a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/cadence-state-panel.tsx:121"}, "properties": {"repobilityId": "2953e42d5422e7e9", "scanner": "scanner-primary", "fingerprint": "08c6fa910947a69a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6655f8f32111b04a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/bulk-add-popover.tsx:98"}, "properties": {"repobilityId": "e336e58df1325b40", "scanner": "scanner-primary", "fingerprint": "6655f8f32111b04a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9975402ed4bda2b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/managers-panel.tsx:124"}, "properties": {"repobilityId": "c009743fb24cc84a", "scanner": "scanner-primary", "fingerprint": "9975402ed4bda2b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c70c31625e3d27e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/curate-panel.tsx:211"}, "properties": {"repobilityId": "36d8b8a42bd33963", "scanner": "scanner-primary", "fingerprint": "5c70c31625e3d27e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-404d02d692ba8263", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/projects/add-to-project-popover.tsx:135"}, "properties": {"repobilityId": "5aed33b3bbbc0dde", "scanner": "scanner-primary", "fingerprint": "404d02d692ba8263", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-598fff9a15e025cf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/ui/markdown-text.tsx:11"}, "properties": {"repobilityId": "4bac37e29a45be6b", "scanner": "scanner-primary", "fingerprint": "598fff9a15e025cf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-714a2c167a5b0a78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/stat-strip.tsx:70"}, "properties": {"repobilityId": "76d27c7bbbb5e88b", "scanner": "scanner-primary", "fingerprint": "714a2c167a5b0a78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-efb2c4e5b5247baa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/ai-limits-warning-card.tsx:115"}, "properties": {"repobilityId": "d55ce5ef61bb3044", "scanner": "scanner-primary", "fingerprint": "efb2c4e5b5247baa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2484c0ee9fce172", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/next-actions-card.tsx:127"}, "properties": {"repobilityId": "32b627d6295126c7", "scanner": "scanner-primary", "fingerprint": "f2484c0ee9fce172", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6bf19ce841e2ed80", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/digest-section.tsx:98"}, "properties": {"repobilityId": "1dc0ba599710587a", "scanner": "scanner-primary", "fingerprint": "6bf19ce841e2ed80", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41ac680a469350f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/hidden-triage-list.tsx:91"}, "properties": {"repobilityId": "b32af49328382847", "scanner": "scanner-primary", "fingerprint": "41ac680a469350f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37e7f285635b131c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/shared-with-you-card.tsx:130"}, "properties": {"repobilityId": "e7e84eb0c63f39d7", "scanner": "scanner-primary", "fingerprint": "37e7f285635b131c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-871b6de21d55eb5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/triage-queue-card.tsx:171"}, "properties": {"repobilityId": "f9eaa4b07ed9dc7e", "scanner": "scanner-primary", "fingerprint": "871b6de21d55eb5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8fe6f5c5c51be1f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/my-day-card.tsx:80"}, "properties": {"repobilityId": "a9e0d99acfbeda37", "scanner": "scanner-primary", "fingerprint": "8fe6f5c5c51be1f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12b3a7044fad8bc3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/dashboard/warm-contacts-card.tsx:35"}, "properties": {"repobilityId": "6d974cfb52b9d643", "scanner": "scanner-primary", "fingerprint": "12b3a7044fad8bc3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d371da6c9254ddb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/reply-window.tsx:621"}, "properties": {"repobilityId": "4d8538e643fb1923", "scanner": "scanner-primary", "fingerprint": "6d371da6c9254ddb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8153327fab5c6291", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/participants-tab.tsx:65"}, "properties": {"repobilityId": "4dad62c1dfc45ce3", "scanner": "scanner-primary", "fingerprint": "8153327fab5c6291", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c79863030702839", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/topics-tab.tsx:55"}, "properties": {"repobilityId": "9ad7cc3d9ef33f14", "scanner": "scanner-primary", "fingerprint": "5c79863030702839", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3000489d9e3b2aa5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-history.tsx:212"}, "properties": {"repobilityId": "5762779f996234c5", "scanner": "scanner-primary", "fingerprint": "3000489d9e3b2aa5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b02909de16953a25", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/message-hits.tsx:123"}, "properties": {"repobilityId": "0c58588a255c5b1d", "scanner": "scanner-primary", "fingerprint": "b02909de16953a25", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-11f8d6e1c1492295", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/chats/message-hits.tsx:38"}, "properties": {"repobilityId": "7ff17bff93d30358", "scanner": "scanner-primary", "fingerprint": "11f8d6e1c1492295", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6026688247aa4c18", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-header.tsx:46"}, "properties": {"repobilityId": "3689307e0709c917", "scanner": "scanner-primary", "fingerprint": "6026688247aa4c18", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83d461409d643ead", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/TopicsList.tsx:70"}, "properties": {"repobilityId": "d83ec7cbf9145c2a", "scanner": "scanner-primary", "fingerprint": "83d461409d643ead", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b09642230218d72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/share-contact-dialog.tsx:210"}, "properties": {"repobilityId": "8755a6190fc930cc", "scanner": "scanner-primary", "fingerprint": "5b09642230218d72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ed26b95194630f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/semantic-hits.tsx:91"}, "properties": {"repobilityId": "01f411b2605145ab", "scanner": "scanner-primary", "fingerprint": "9ed26b95194630f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b467675098768704", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/add-chat-dialog.tsx:151"}, "properties": {"repobilityId": "770bcc68c40dc3ae", "scanner": "scanner-primary", "fingerprint": "b467675098768704", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5fa714ec30a3e7f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/folder-members-dialog.tsx:93"}, "properties": {"repobilityId": "dfa8eb31568d7bbb", "scanner": "scanner-primary", "fingerprint": "5fa714ec30a3e7f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f0de9a941be2f48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-row.tsx:171"}, "properties": {"repobilityId": "8332a102bcc50bb0", "scanner": "scanner-primary", "fingerprint": "4f0de9a941be2f48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e357cd847ae711ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/chats/chat-cadence-block.tsx:124"}, "properties": {"repobilityId": "36c1af9790f36058", "scanner": "scanner-primary", "fingerprint": "e357cd847ae711ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73258de48dc7eced", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/cadence-wizard/step-attachments.tsx:128"}, "properties": {"repobilityId": "c0f087b03d7683ea", "scanner": "scanner-primary", "fingerprint": "73258de48dc7eced", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27314b564306fa38", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/tasks/contact-picker.tsx:72"}, "properties": {"repobilityId": "f9eee395fba5553c", "scanner": "scanner-primary", "fingerprint": "27314b564306fa38", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abe236d088a88979", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/tasks/tasks-list.tsx:709"}, "properties": {"repobilityId": "58b1330b01d168be", "scanner": "scanner-primary", "fingerprint": "abe236d088a88979", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5777a21a7c1a4086", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/tasks/new-task-dialog.tsx:318"}, "properties": {"repobilityId": "31c8861f721bf98f", "scanner": "scanner-primary", "fingerprint": "5777a21a7c1a4086", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30cb4e714e261998", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/admin/TGAccountList.tsx:122"}, "properties": {"repobilityId": "e515347792a072b4", "scanner": "scanner-primary", "fingerprint": "30cb4e714e261998", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf3ebcae3824db3c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/admin/ScopeAccessPanel.tsx:326"}, "properties": {"repobilityId": "e1e672fd0b1fdbb1", "scanner": "scanner-primary", "fingerprint": "cf3ebcae3824db3c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fe10d82ee5cade23", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/me-grants/me-grants-client.tsx:83"}, "properties": {"repobilityId": "7682aca7f5a61978", "scanner": "scanner-primary", "fingerprint": "fe10d82ee5cade23", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d27e918be2eff8e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/broadcasts/create-broadcast-dialog.tsx:437"}, "properties": {"repobilityId": "a5e882703af17aa7", "scanner": "scanner-primary", "fingerprint": "d27e918be2eff8e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f6101ee119df187", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/broadcasts/broadcast-detail.tsx:344"}, "properties": {"repobilityId": "4bec207b6177afe5", "scanner": "scanner-primary", "fingerprint": "6f6101ee119df187", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f42e05daac203ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/cadences/CadenceEditor.tsx:746"}, "properties": {"repobilityId": "77a2cc696d9299c3", "scanner": "scanner-primary", "fingerprint": "9f42e05daac203ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6d4cd3e7cd4687f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/person-meta-card.tsx:65"}, "properties": {"repobilityId": "e090f278d2018752", "scanner": "scanner-primary", "fingerprint": "f6d4cd3e7cd4687f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5afca2990fbf328d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/activity-tab.tsx:52"}, "properties": {"repobilityId": "0e0c4214d787c25b", "scanner": "scanner-primary", "fingerprint": "5afca2990fbf328d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2eabbc1c5ab44ec3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/person-row.tsx:71"}, "properties": {"repobilityId": "bb88424f6b930711", "scanner": "scanner-primary", "fingerprint": "2eabbc1c5ab44ec3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f451dad2fe6407ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/in-chats-tab.tsx:59"}, "properties": {"repobilityId": "1451c5cf8620e4fc", "scanner": "scanner-primary", "fingerprint": "f451dad2fe6407ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-563cb50340dc4a53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/people/person-header.tsx:63"}, "properties": {"repobilityId": "5e12615f17e89940", "scanner": "scanner-primary", "fingerprint": "563cb50340dc4a53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c470738147e8c9f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(authed)/people/people-list.tsx:609"}, "properties": {"repobilityId": "6bf81288f2e345b1", "scanner": "scanner-primary", "fingerprint": "c470738147e8c9f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b25d2cfa4a6ea1c4", "level": "warning", "message": {"text": "Privileged port 3 in use"}, "properties": {"repobilityId": "261b7b1c6a18d412", "scanner": "scanner-primary", "fingerprint": "b25d2cfa4a6ea1c4", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/scripts/pg-backup.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bd1ad0e5c8c3dd11", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/cadence-worker/Dockerfile"}, "properties": {"repobilityId": "431d773d2ffe431d", "scanner": "scanner-primary", "fingerprint": "bd1ad0e5c8c3dd11", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-e92798a74c5ae1f9", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "727b700742b97d94", "scanner": "scanner-primary", "fingerprint": "e92798a74c5ae1f9", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/cadence-worker/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-e92798a74c5ae1f9", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "001aee0f707a9a35", "scanner": "scanner-primary", "fingerprint": "e92798a74c5ae1f9", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/cadence-worker/Dockerfile"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-d9980d9104825b19", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/api/Dockerfile"}, "properties": {"repobilityId": "e591b11d8a0c1fe7", "scanner": "scanner-primary", "fingerprint": "d9980d9104825b19", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-c36b30587c620ebd", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "41c7ea1af5d24936", "scanner": "scanner-primary", "fingerprint": "c36b30587c620ebd", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-c36b30587c620ebd", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "b4268733366998d1", "scanner": "scanner-primary", "fingerprint": "c36b30587c620ebd", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-a8d9e16082789b05", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/ai-worker/Dockerfile"}, "properties": {"repobilityId": "a30ac3c278661ffc", "scanner": "scanner-primary", "fingerprint": "a8d9e16082789b05", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-baf67258ef4733ef", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "26ad11f2d8c374de", "scanner": "scanner-primary", "fingerprint": "baf67258ef4733ef", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ai-worker/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-baf67258ef4733ef", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "0c4e4b42c791349e", "scanner": "scanner-primary", "fingerprint": "baf67258ef4733ef", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ai-worker/Dockerfile"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-115321550132004d", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/tg-worker/Dockerfile"}, "properties": {"repobilityId": "b3aded61dc3da6c0", "scanner": "scanner-primary", "fingerprint": "115321550132004d", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-0a6ac4f60f895fe7", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "3b39921dadc9870e", "scanner": "scanner-primary", "fingerprint": "0a6ac4f60f895fe7", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-0a6ac4f60f895fe7", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "127fa49de97c572b", "scanner": "scanner-primary", "fingerprint": "0a6ac4f60f895fe7", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/Dockerfile"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-f2620ed8f693ce7e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-slim"}, "properties": {"repobilityId": "d7d2b7d9347c355a", "scanner": "scanner-primary", "fingerprint": "f2620ed8f693ce7e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-f2620ed8f693ce7e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-slim"}, "properties": {"repobilityId": "b308cdbb53410114", "scanner": "scanner-primary", "fingerprint": "f2620ed8f693ce7e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-f2620ed8f693ce7e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-slim"}, "properties": {"repobilityId": "e21d73d047a5a847", "scanner": "scanner-primary", "fingerprint": "f2620ed8f693ce7e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 26}}}]}, {"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-64192a3c67110d01", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "87338a8bfcb6f435", "scanner": "scanner-primary", "fingerprint": "64192a3c67110d01", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c777d20e3eda66e3", "level": "note", "message": {"text": "Very large file: apps/api/tests/test_projects.py (2244 lines)"}, "properties": {"repobilityId": "b2c586c4a99a1d03", "scanner": "scanner-primary", "fingerprint": "c777d20e3eda66e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4f789acac2fe0289", "level": "note", "message": {"text": "Very large file: apps/api/tests/test_broadcasts.py (1463 lines)"}, "properties": {"repobilityId": "966ee28621cc43c4", "scanner": "scanner-primary", "fingerprint": "4f789acac2fe0289", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-42915b4fe4111e6e", "level": "note", "message": {"text": "Very large file: apps/api/src/pulse_api/routes/projects.py (1776 lines)"}, "properties": {"repobilityId": "10a3dfbf3c70c578", "scanner": "scanner-primary", "fingerprint": "42915b4fe4111e6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6c73edb0c0482c33", "level": "note", "message": {"text": "Very large file: apps/api/src/pulse_api/routes/conversations.py (2148 lines)"}, "properties": {"repobilityId": "2c5bf4c0d3f9bcc0", "scanner": "scanner-primary", "fingerprint": "6c73edb0c0482c33", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "8dd292d2fe444a02", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "ab251a9c82e262ac", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "1776325a7bf9662e", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "e6293879c3014ad6", "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": "b0b1f13f46d07358", "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": "507fd3931547b69f", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-da178774159dfc93", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/cadence-worker/tests/test_embedding_backfill_cron.py:64"}, "properties": {"repobilityId": "faf12d141e7221b1", "scanner": "scanner-primary", "fingerprint": "da178774159dfc93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2fc7409d8b7c64c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/cadence-worker/tests/test_daily_digest.py:87"}, "properties": {"repobilityId": "356206f5038cf5a1", "scanner": "scanner-primary", "fingerprint": "e2fc7409d8b7c64c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ceb85d7e37667c9", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/cadence-worker/src/pulse_cadence_worker/embedding_backfill_cron.py:91"}, "properties": {"repobilityId": "e5b41e2d43814609", "scanner": "scanner-primary", "fingerprint": "6ceb85d7e37667c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f462cb9a99d52b39", "level": "note", "message": {"text": "Legacy-named symbol `cid_old` in apps/api/tests/test_share_to_manager.py:370"}, "properties": {"repobilityId": "97054fc4096abcb9", "scanner": "scanner-primary", "fingerprint": "f462cb9a99d52b39", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2757c18feb47d3c9", "level": "note", "message": {"text": "Legacy-named symbol `acct_old` in apps/api/tests/test_projects.py:202"}, "properties": {"repobilityId": "65652ad6f1a84696", "scanner": "scanner-primary", "fingerprint": "2757c18feb47d3c9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6b8b2e7816e97060", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/tests/test_projects.py:8"}, "properties": {"repobilityId": "8bb5943e3aa5bf1a", "scanner": "scanner-primary", "fingerprint": "6b8b2e7816e97060", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cef04328b06f1d86", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/tests/test_conversations_project_filter.py:54"}, "properties": {"repobilityId": "29ee5f5d58b7bfc6", "scanner": "scanner-primary", "fingerprint": "cef04328b06f1d86", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ad0a57c5e7aad04", "level": "note", "message": {"text": "Legacy-named symbol `acct_old` in apps/api/tests/test_broadcasts.py:154"}, "properties": {"repobilityId": "0ba554d56cd390ed", "scanner": "scanner-primary", "fingerprint": "2ad0a57c5e7aad04", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-75a3cf320523e6f1", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/tests/test_broadcasts.py:625"}, "properties": {"repobilityId": "5c9705bc30120f18", "scanner": "scanner-primary", "fingerprint": "75a3cf320523e6f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d41fd2ae998711c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/tests/test_ai_catalogue.py:13"}, "properties": {"repobilityId": "bcfe40e6f81b1a75", "scanner": "scanner-primary", "fingerprint": "6d41fd2ae998711c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e51c404a3bd519b0", "level": "note", "message": {"text": "Legacy-named symbol `test_suggestions_branch_ignored_when_read_old` in apps/api/tests/test_ai_reply_suggestions.py:86"}, "properties": {"repobilityId": "955a1bbb121b8d1d", "scanner": "scanner-primary", "fingerprint": "e51c404a3bd519b0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bad10719ce9f700d", "level": "note", "message": {"text": "Legacy-named symbol `conversations_legacy` in apps/api/tests/test_admin_stats.py:65"}, "properties": {"repobilityId": "8d4841ba05b86ad9", "scanner": "scanner-primary", "fingerprint": "bad10719ce9f700d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0244361f1db08bfc", "level": "note", "message": {"text": "Legacy-named symbol `include_legacy` in apps/api/tests/test_admin_account_isolation.py:287"}, "properties": {"repobilityId": "e2b4dcd8b1afe216", "scanner": "scanner-primary", "fingerprint": "0244361f1db08bfc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cced607f240607d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/_acl_grants.py:56"}, "properties": {"repobilityId": "29296e9ac4b0d392", "scanner": "scanner-primary", "fingerprint": "cced607f240607d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b328054d5968b88e", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/pulse_api/deps.py:13"}, "properties": {"repobilityId": "09eb8faf42a06abb", "scanner": "scanner-primary", "fingerprint": "b328054d5968b88e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3db4e6f3a17449f6", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/pulse_api/config.py:32"}, "properties": {"repobilityId": "08013e0d38369b70", "scanner": "scanner-primary", "fingerprint": "3db4e6f3a17449f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-65a9ce4b55fbea44", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/pulse_api/_semantic_search.py:183"}, "properties": {"repobilityId": "67089dd4d0be4f7e", "scanner": "scanner-primary", "fingerprint": "65a9ce4b55fbea44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8886b3ea4a29e35", "level": "none", "message": {"text": "Commented-code block (11 lines) in apps/api/src/pulse_api/_contacts_acl.py:36"}, "properties": {"repobilityId": "4ee5de966110f6d8", "scanner": "scanner-primary", "fingerprint": "d8886b3ea4a29e35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62ee9864470c9a71", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/_cadence_read.py:77"}, "properties": {"repobilityId": "0531e7316f044d67", "scanner": "scanner-primary", "fingerprint": "62ee9864470c9a71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52756e510f17ca92", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/api/src/pulse_api/_accounts_acl.py:22"}, "properties": {"repobilityId": "8b63af89ab58648a", "scanner": "scanner-primary", "fingerprint": "52756e510f17ca92", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91763586740dfe0f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/_project_ingest.py:333"}, "properties": {"repobilityId": "27191bd52a2ddeca", "scanner": "scanner-primary", "fingerprint": "91763586740dfe0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7208228b3b4e2f43", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/pulse_api/routes/projects.py:39"}, "properties": {"repobilityId": "1d2e7dc1ba2a5128", "scanner": "scanner-primary", "fingerprint": "7208228b3b4e2f43", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e25edf4c8998eaf", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/cadence_ai_suggest.py:170"}, "properties": {"repobilityId": "0f5c2a88f6b50a21", "scanner": "scanner-primary", "fingerprint": "5e25edf4c8998eaf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7853fd9b60af7c64", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/ai_models.py:69"}, "properties": {"repobilityId": "69ef89913508d0c1", "scanner": "scanner-primary", "fingerprint": "7853fd9b60af7c64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d84f226efd6b5ca1", "level": "note", "message": {"text": "Legacy-named symbol `include_legacy` in apps/api/src/pulse_api/routes/conversations.py:270"}, "properties": {"repobilityId": "5e0b193609ebea08", "scanner": "scanner-primary", "fingerprint": "d84f226efd6b5ca1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6304f175ef08338c", "level": "none", "message": {"text": "Commented-code block (14 lines) in apps/api/src/pulse_api/routes/conversations.py:292"}, "properties": {"repobilityId": "f94a39a187c4b565", "scanner": "scanner-primary", "fingerprint": "6304f175ef08338c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96c1b37ee58eff49", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/digest.py:42"}, "properties": {"repobilityId": "165ff1ab71c25e97", "scanner": "scanner-primary", "fingerprint": "96c1b37ee58eff49", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1ac7a1b2a474cba", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/tasks.py:772"}, "properties": {"repobilityId": "85d653dcf0c4d773", "scanner": "scanner-primary", "fingerprint": "d1ac7a1b2a474cba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95db1b2405bb197a", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in apps/api/src/pulse_api/routes/triage.py:615"}, "properties": {"repobilityId": "d0c27f8173867d9c", "scanner": "scanner-primary", "fingerprint": "95db1b2405bb197a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5072697ddcd899dd", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/triage.py:458"}, "properties": {"repobilityId": "c4da9baad05151be", "scanner": "scanner-primary", "fingerprint": "5072697ddcd899dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02f13c79da6b3bd8", "level": "none", "message": {"text": "Commented-code block (11 lines) in apps/api/src/pulse_api/routes/me.py:19"}, "properties": {"repobilityId": "6b755faf73b1f5f7", "scanner": "scanner-primary", "fingerprint": "02f13c79da6b3bd8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe5f3a7fc34376b6", "level": "note", "message": {"text": "Legacy-named symbol `conversations_legacy` in apps/api/src/pulse_api/routes/admin_stats.py:34"}, "properties": {"repobilityId": "7a12c0e27a4987e2", "scanner": "scanner-primary", "fingerprint": "fe5f3a7fc34376b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c193f365d24547a4", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/admin_invites.py:115"}, "properties": {"repobilityId": "f5eac2508f5675d7", "scanner": "scanner-primary", "fingerprint": "c193f365d24547a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f139707bda0d172", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/admin_ops.py:43"}, "properties": {"repobilityId": "d967118c3b386c54", "scanner": "scanner-primary", "fingerprint": "2f139707bda0d172", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41c0a531555b9923", "level": "note", "message": {"text": "Legacy-named symbol `include_legacy` in apps/api/src/pulse_api/routes/people.py:68"}, "properties": {"repobilityId": "864684da953ec2e9", "scanner": "scanner-primary", "fingerprint": "41c0a531555b9923", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4409a6a458a38cab", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/pulse_api/routes/people.py:87"}, "properties": {"repobilityId": "31f603ffc1325e32", "scanner": "scanner-primary", "fingerprint": "4409a6a458a38cab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-031bb75eb1b43431", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/pulse_api/routes/stats.py:71"}, "properties": {"repobilityId": "21970ce1f7591495", "scanner": "scanner-primary", "fingerprint": "031bb75eb1b43431", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb5082f7f2641e38", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/pulse_api/routes/broadcasts.py:87"}, "properties": {"repobilityId": "059adeee54c02166", "scanner": "scanner-primary", "fingerprint": "fb5082f7f2641e38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-396ffdf2037372f7", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/api/src/pulse_api/routes/system.py:54"}, "properties": {"repobilityId": "50639d3e7376781b", "scanner": "scanner-primary", "fingerprint": "396ffdf2037372f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce2a55b6004756af", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/ai-worker/tests/test_analyze.py:264"}, "properties": {"repobilityId": "6635ef76c9b3f055", "scanner": "scanner-primary", "fingerprint": "ce2a55b6004756af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb37053bd9c0ae0b", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/ai-worker/src/pulse_ai_worker/main.py:30"}, "properties": {"repobilityId": "49978a7ed9253743", "scanner": "scanner-primary", "fingerprint": "cb37053bd9c0ae0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-745e443493601682", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/ai-worker/src/pulse_ai_worker/tasks/analyze.py:157"}, "properties": {"repobilityId": "502247ca5ce3d3da", "scanner": "scanner-primary", "fingerprint": "745e443493601682", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bed8f44c944bf59f", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/ai-worker/src/pulse_ai_worker/tasks/auto_feed.py:105"}, "properties": {"repobilityId": "22661f819325356f", "scanner": "scanner-primary", "fingerprint": "bed8f44c944bf59f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-393f518c2551ddb5", "level": "note", "message": {"text": "Legacy-named symbol `test_apply_filters_diff_binds_to_connected_not_legacy` in apps/tg-worker/tests/test_folders_pull.py:108"}, "properties": {"repobilityId": "e6b227dd14297359", "scanner": "scanner-primary", "fingerprint": "393f518c2551ddb5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a376afa6c19a86cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/clients.py:54"}, "properties": {"repobilityId": "0e4221c457a5ca20", "scanner": "scanner-primary", "fingerprint": "a376afa6c19a86cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-700ee7f2ca9730ce", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/backfill.py:58"}, "properties": {"repobilityId": "64e8d3b8914f1d11", "scanner": "scanner-primary", "fingerprint": "700ee7f2ca9730ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-169d22a4c9672062", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/tg-worker/src/pulse_tg_worker/config.py:24"}, "properties": {"repobilityId": "76885bf69736129e", "scanner": "scanner-primary", "fingerprint": "169d22a4c9672062", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b0995094e7291c4", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/broadcast_runner.py:110"}, "properties": {"repobilityId": "7ae2c5d6197b6e90", "scanner": "scanner-primary", "fingerprint": "6b0995094e7291c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46dbd0b70591b122", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/ingest.py:281"}, "properties": {"repobilityId": "e355029f12b42762", "scanner": "scanner-primary", "fingerprint": "46dbd0b70591b122", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18f8f5c5a4ee8cee", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/handlers.py:63"}, "properties": {"repobilityId": "0423a150c2d3e8c3", "scanner": "scanner-primary", "fingerprint": "18f8f5c5a4ee8cee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02eef8f751a25c48", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/api.py:113"}, "properties": {"repobilityId": "a949b088c69c312c", "scanner": "scanner-primary", "fingerprint": "02eef8f751a25c48", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb7d8f2b757d0f0d", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/main.py:68"}, "properties": {"repobilityId": "195dbc87580953c6", "scanner": "scanner-primary", "fingerprint": "bb7d8f2b757d0f0d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4580f51459d1491a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/peer_backfill.py:77"}, "properties": {"repobilityId": "46120de55a2cba7b", "scanner": "scanner-primary", "fingerprint": "4580f51459d1491a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78c8aaa900d1d8b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/tg-worker/src/pulse_tg_worker/folders.py:22"}, "properties": {"repobilityId": "f05ce5748d3d2871", "scanner": "scanner-primary", "fingerprint": "78c8aaa900d1d8b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d0239cb7363a998", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/auth.ts:10"}, "properties": {"repobilityId": "8dd5fdce08e7c37a", "scanner": "scanner-primary", "fingerprint": "5d0239cb7363a998", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4979d32e053806b9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/account-switcher.tsx:19"}, "properties": {"repobilityId": "cb5f9b147948d2b2", "scanner": "scanner-primary", "fingerprint": "4979d32e053806b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f4f453b464481b29", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/app-sidebar.tsx:34"}, "properties": {"repobilityId": "231f8d50039f35c6", "scanner": "scanner-primary", "fingerprint": "f4f453b464481b29", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c444a3643d5016c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/mobile-nav.tsx:35"}, "properties": {"repobilityId": "7c1111095a5c4642", "scanner": "scanner-primary", "fingerprint": "c444a3643d5016c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8ea8b97c87a06ccb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/digest-settings-card.tsx:23"}, "properties": {"repobilityId": "52b0a6d07e917a21", "scanner": "scanner-primary", "fingerprint": "8ea8b97c87a06ccb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2da2bc1ccad5e2ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/my-tg-accounts.tsx:20"}, "properties": {"repobilityId": "c3ce6c3f1422bf74", "scanner": "scanner-primary", "fingerprint": "2da2bc1ccad5e2ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-47e062a1465a740f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/preferences-card.tsx:18"}, "properties": {"repobilityId": "89321cb6a862a1b4", "scanner": "scanner-primary", "fingerprint": "47e062a1465a740f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3bbee724495aba07", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/my-budget-card.tsx:26"}, "properties": {"repobilityId": "3eb36590685f19f5", "scanner": "scanner-primary", "fingerprint": "3bbee724495aba07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cc27e5eae0017218", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/ai-limits-card.tsx:63"}, "properties": {"repobilityId": "cf7689070bac270a", "scanner": "scanner-primary", "fingerprint": "cc27e5eae0017218", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f9d059abb0acbd36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/shared-contacts-card.tsx:32"}, "properties": {"repobilityId": "a3844ca3665bdf08", "scanner": "scanner-primary", "fingerprint": "f9d059abb0acbd36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-80a25f936a18ac06", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/profile-card.tsx:20"}, "properties": {"repobilityId": "379b14fc990be1cb", "scanner": "scanner-primary", "fingerprint": "80a25f936a18ac06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd2e7dba8401f47d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/settings/llm-routes-card.tsx:22"}, "properties": {"repobilityId": "841da840e7a8c1d3", "scanner": "scanner-primary", "fingerprint": "cd2e7dba8401f47d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88ab1014c1368d0a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/notifications/notifications-bell.tsx:21"}, "properties": {"repobilityId": "d04d5d091ad3cd46", "scanner": "scanner-primary", "fingerprint": "88ab1014c1368d0a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b57ecdec25e2500", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/notifications/notifications-inbox.tsx:20"}, "properties": {"repobilityId": "ea97d66513c4f9fa", "scanner": "scanner-primary", "fingerprint": "5b57ecdec25e2500", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0c8633774d5b6ef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/i18n/language-toggle.tsx:16"}, "properties": {"repobilityId": "834a52a43bc00410", "scanner": "scanner-primary", "fingerprint": "d0c8633774d5b6ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aafc73144d15e701", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/draft-dialog.tsx:159"}, "properties": {"repobilityId": "d7f79f1f9496b670", "scanner": "scanner-primary", "fingerprint": "aafc73144d15e701", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65229dc55ecadd9f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/project-starter-picker.tsx:19"}, "properties": {"repobilityId": "f581f4531692c5b9", "scanner": "scanner-primary", "fingerprint": "65229dc55ecadd9f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f4aa4d1f4cae74f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/new-project-dialog.tsx:39"}, "properties": {"repobilityId": "e1555b86ed23b8b2", "scanner": "scanner-primary", "fingerprint": "8f4aa4d1f4cae74f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-06e4b2a83f422099", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/members-table.tsx:102"}, "properties": {"repobilityId": "fb356548067f6308", "scanner": "scanner-primary", "fingerprint": "06e4b2a83f422099", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-418d12464c70eca0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/cadence-state-panel.tsx:43"}, "properties": {"repobilityId": "dbb775db74d85b33", "scanner": "scanner-primary", "fingerprint": "418d12464c70eca0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c2187ade1b2757df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/bulk-add-popover.tsx:37"}, "properties": {"repobilityId": "e648392587969ac1", "scanner": "scanner-primary", "fingerprint": "c2187ade1b2757df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d59a3ea520409e79", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/managers-panel.tsx:29"}, "properties": {"repobilityId": "cc845e25b101040c", "scanner": "scanner-primary", "fingerprint": "d59a3ea520409e79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8c2925d83f13da7b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/pitch-editor.tsx:25"}, "properties": {"repobilityId": "cb92cecaade71f34", "scanner": "scanner-primary", "fingerprint": "8c2925d83f13da7b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4cc3281cf556fafa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/curate-panel.tsx:81"}, "properties": {"repobilityId": "a612463c83f61bfd", "scanner": "scanner-primary", "fingerprint": "4cc3281cf556fafa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c0b78b254906df9b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/project-header.tsx:39"}, "properties": {"repobilityId": "c3c9afc72bc70a62", "scanner": "scanner-primary", "fingerprint": "c0b78b254906df9b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4e2eebf13d42d4b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/projects/goal-editor.tsx:25"}, "properties": {"repobilityId": "a067caf5add87c5c", "scanner": "scanner-primary", "fingerprint": "4e2eebf13d42d4b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0ec04c36052820e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/stat-strip.tsx:22"}, "properties": {"repobilityId": "150c862caf639376", "scanner": "scanner-primary", "fingerprint": "a0ec04c36052820e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bc1379b69535afe8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/next-actions-card.tsx:30"}, "properties": {"repobilityId": "b3a9a52e3b88a4dd", "scanner": "scanner-primary", "fingerprint": "bc1379b69535afe8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0466388656449f75", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/hidden-triage-list.tsx:13"}, "properties": {"repobilityId": "8c2b8d64a588b589", "scanner": "scanner-primary", "fingerprint": "0466388656449f75", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c29f40d1913831b5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/onboarding-checklist.tsx:28"}, "properties": {"repobilityId": "fb98727e1e8dcc7d", "scanner": "scanner-primary", "fingerprint": "c29f40d1913831b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-04cce681ca90a27a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/shared-with-you-card.tsx:35"}, "properties": {"repobilityId": "7f7ffbe072b058b9", "scanner": "scanner-primary", "fingerprint": "04cce681ca90a27a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a3047922632f23b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/use-triage-counts.ts:25"}, "properties": {"repobilityId": "872a85d6ae68b2a1", "scanner": "scanner-primary", "fingerprint": "1a3047922632f23b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fbf0596495e1f745", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/backfill-progress.tsx:19"}, "properties": {"repobilityId": "86fcfd73d7d836fd", "scanner": "scanner-primary", "fingerprint": "fbf0596495e1f745", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f407a7bdff0891bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/triage-queue-card.tsx:101"}, "properties": {"repobilityId": "85ad896a31f6cef2", "scanner": "scanner-primary", "fingerprint": "f407a7bdff0891bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-06dfd0d8e116e519", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/dashboard/my-day-card.tsx:38"}, "properties": {"repobilityId": "53606beda9cef00d", "scanner": "scanner-primary", "fingerprint": "06dfd0d8e116e519", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5dd75b5d87db7d0a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/chats-freshness.tsx:29"}, "properties": {"repobilityId": "89fa6a0d1c541954", "scanner": "scanner-primary", "fingerprint": "5dd75b5d87db7d0a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a96bf3a59c8b41b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/chats/reply-window.tsx:517"}, "properties": {"repobilityId": "ca0d23e7f7c590d6", "scanner": "scanner-primary", "fingerprint": "7a96bf3a59c8b41b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d10269e0043bf73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/reply-window.tsx:83"}, "properties": {"repobilityId": "c312f5f9c34ed808", "scanner": "scanner-primary", "fingerprint": "6d10269e0043bf73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b90a5156bda2a20", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/shared-by-chips.tsx:24"}, "properties": {"repobilityId": "b9e5bdfaa3dbd0e9", "scanner": "scanner-primary", "fingerprint": "9b90a5156bda2a20", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bffc836d44d07ec8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/topics-tab.tsx:13"}, "properties": {"repobilityId": "35b82e1f6404545b", "scanner": "scanner-primary", "fingerprint": "bffc836d44d07ec8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0eee536b3c841b60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/add-folder-to-project-dialog.tsx:32"}, "properties": {"repobilityId": "cdc80a6e33f89b95", "scanner": "scanner-primary", "fingerprint": "0eee536b3c841b60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3466ac80ccc740dd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/TopicsList.tsx:24"}, "properties": {"repobilityId": "3b735c934513c696", "scanner": "scanner-primary", "fingerprint": "3466ac80ccc740dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98430a5f0ebbd455", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/peek-panel.tsx:89"}, "properties": {"repobilityId": "03864ba4ea221ab0", "scanner": "scanner-primary", "fingerprint": "98430a5f0ebbd455", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e1a60032a38361ef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/OwnerControl.tsx:9"}, "properties": {"repobilityId": "b0df008eb9c7e6a1", "scanner": "scanner-primary", "fingerprint": "e1a60032a38361ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6974a7808d21d6ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/project-chips.tsx:22"}, "properties": {"repobilityId": "c06448741b718b5f", "scanner": "scanner-primary", "fingerprint": "6974a7808d21d6ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-691a519168b00783", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/share-contact-dialog.tsx:36"}, "properties": {"repobilityId": "bcd2bcdcc5a935cb", "scanner": "scanner-primary", "fingerprint": "691a519168b00783", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ede83ce54ca0b3a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/add-chat-dialog.tsx:38"}, "properties": {"repobilityId": "d3977bdbad98e4db", "scanner": "scanner-primary", "fingerprint": "0ede83ce54ca0b3a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-266688a278349133", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/sender-account-picker.tsx:21"}, "properties": {"repobilityId": "a3acd60b09e8a2aa", "scanner": "scanner-primary", "fingerprint": "266688a278349133", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ac7dc33646e1ca3b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/sender-badge.tsx:20"}, "properties": {"repobilityId": "7137fc0680a919e1", "scanner": "scanner-primary", "fingerprint": "ac7dc33646e1ca3b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-503e7430df8c2d36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/folder-chips.tsx:48"}, "properties": {"repobilityId": "5338b935efd884a4", "scanner": "scanner-primary", "fingerprint": "503e7430df8c2d36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dca48d30a2910af1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/chats/folder-members-dialog.tsx:24"}, "properties": {"repobilityId": "3a6e714678481daa", "scanner": "scanner-primary", "fingerprint": "dca48d30a2910af1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1a1f1a86903abf6", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/chats/ai-summary-card.tsx:44"}, "properties": {"repobilityId": "3a58b526d5e74599", "scanner": "scanner-primary", "fingerprint": "b1a1f1a86903abf6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec9c1ad79af55a9c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/chats/chat-row.tsx:127"}, "properties": {"repobilityId": "fc30cba1a671713c", "scanner": "scanner-primary", "fingerprint": "ec9c1ad79af55a9c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42156de82a3fcb1b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/cadence-wizard/linear-detect.ts:1"}, "properties": {"repobilityId": "8bfb76345e136f7d", "scanner": "scanner-primary", "fingerprint": "42156de82a3fcb1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e982d44f57426fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/cadence-wizard/mode-tabs.tsx:47"}, "properties": {"repobilityId": "b038d144fb4a7a54", "scanner": "scanner-primary", "fingerprint": "4e982d44f57426fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76a4c88d7c29f7a0", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/tasks/tasks-list.tsx:119"}, "properties": {"repobilityId": "e6a51a8e35688a40", "scanner": "scanner-primary", "fingerprint": "76a4c88d7c29f7a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d824bc41d6ffba6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/tasks-list.tsx:84"}, "properties": {"repobilityId": "8b61d9c759da6535", "scanner": "scanner-primary", "fingerprint": "3d824bc41d6ffba6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e51aeeca357e997", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/tasks-stats.tsx:17"}, "properties": {"repobilityId": "18a21066b7b58e38", "scanner": "scanner-primary", "fingerprint": "2e51aeeca357e997", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1d886af84c55e9fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/new-task-dialog.tsx:45"}, "properties": {"repobilityId": "570462867fdb4fce", "scanner": "scanner-primary", "fingerprint": "1d886af84c55e9fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ffda0e52bbcbc105", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/__tests__/new-task-dialog-contact.test.tsx:108"}, "properties": {"repobilityId": "e82ca1b2e5e40512", "scanner": "scanner-primary", "fingerprint": "ffda0e52bbcbc105", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f8c4c4eb60ce8dfb", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/components/tasks/__tests__/tasks-lifecycle.test.tsx:151"}, "properties": {"repobilityId": "41ea24aad60c8048", "scanner": "scanner-primary", "fingerprint": "f8c4c4eb60ce8dfb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ce5406cabf9d12e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/tasks/__tests__/tasks-lifecycle.test.tsx:140"}, "properties": {"repobilityId": "17f2f6b4ad344630", "scanner": "scanner-primary", "fingerprint": "7ce5406cabf9d12e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4f1619f1fd874cba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/InvitesList.tsx:34"}, "properties": {"repobilityId": "3fdca4978a6bf593", "scanner": "scanner-primary", "fingerprint": "4f1619f1fd874cba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea3d9230180f747c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/IngestDashboard.tsx:46"}, "properties": {"repobilityId": "595aff83d09d76fe", "scanner": "scanner-primary", "fingerprint": "ea3d9230180f747c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cab6ec4ec038c3d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/GrantsOverview.tsx:53"}, "properties": {"repobilityId": "d97844c27a1f12c4", "scanner": "scanner-primary", "fingerprint": "cab6ec4ec038c3d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c39e6d436aa1481", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/TGAccountList.tsx:35"}, "properties": {"repobilityId": "be546373641e32a8", "scanner": "scanner-primary", "fingerprint": "2c39e6d436aa1481", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5321fa5f794640b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/UserList.tsx:36"}, "properties": {"repobilityId": "084eb32c79ddada4", "scanner": "scanner-primary", "fingerprint": "d5321fa5f794640b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-beae04c6cd8bb4fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/admin/ScopeAccessPanel.tsx:44"}, "properties": {"repobilityId": "97e9a717698bf361", "scanner": "scanner-primary", "fingerprint": "beae04c6cd8bb4fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a23c222965c2b440", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/me-grants/me-grants-client.tsx:38"}, "properties": {"repobilityId": "da18916ebddb77c5", "scanner": "scanner-primary", "fingerprint": "a23c222965c2b440", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28db385198034d5d", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/broadcasts/create-broadcast-dialog.tsx:126"}, "properties": {"repobilityId": "08957041f63164a1", "scanner": "scanner-primary", "fingerprint": "28db385198034d5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-954b6b0f170edd08", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/broadcasts/create-broadcast-dialog.tsx:44"}, "properties": {"repobilityId": "608ad8d61dcebe50", "scanner": "scanner-primary", "fingerprint": "954b6b0f170edd08", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-56cd8a4941c037b2", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/components/broadcasts/broadcasts-list.tsx:36"}, "properties": {"repobilityId": "924fbf0361e37873", "scanner": "scanner-primary", "fingerprint": "56cd8a4941c037b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5cafc8846f3ebb1e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/broadcasts/broadcasts-list.tsx:28"}, "properties": {"repobilityId": "6d2cdf928fb04122", "scanner": "scanner-primary", "fingerprint": "5cafc8846f3ebb1e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9d48370a490511ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/broadcasts/broadcast-detail.tsx:33"}, "properties": {"repobilityId": "6363da11d8f8d7d6", "scanner": "scanner-primary", "fingerprint": "9d48370a490511ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-43bb8b16a841a5f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/cadences/CadenceEditor.tsx:61"}, "properties": {"repobilityId": "0707421edc265457", "scanner": "scanner-primary", "fingerprint": "43bb8b16a841a5f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-132a0eb1b835ed53", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/people/similar-tab-lazy.tsx:19"}, "properties": {"repobilityId": "0dea792e0b1344f1", "scanner": "scanner-primary", "fingerprint": "132a0eb1b835ed53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0fab46539190269", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/components/people/project-chip-remove.tsx:26"}, "properties": {"repobilityId": "d4d04080a19c778a", "scanner": "scanner-primary", "fingerprint": "e0fab46539190269", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-75ba35fee08e3f84", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/people/__tests__/people-list.test.tsx:371"}, "properties": {"repobilityId": "a8465f9ea7df2bc7", "scanner": "scanner-primary", "fingerprint": "75ba35fee08e3f84", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54635df138af7f04", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/projects/[id]/page.tsx:102"}, "properties": {"repobilityId": "d8972ae79759352d", "scanner": "scanner-primary", "fingerprint": "54635df138af7f04", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9dd29d51c7e7790", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/chats/page.tsx:33"}, "properties": {"repobilityId": "e896c6d396d623d6", "scanner": "scanner-primary", "fingerprint": "b9dd29d51c7e7790", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eaca567a4d1c635a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/chats/chats-list.tsx:103"}, "properties": {"repobilityId": "a5370f29c9a4a576", "scanner": "scanner-primary", "fingerprint": "eaca567a4d1c635a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98fe47fc5c511061", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(authed)/chats/chats-list.tsx:288"}, "properties": {"repobilityId": "057d53ce7e99a32b", "scanner": "scanner-primary", "fingerprint": "98fe47fc5c511061", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce4bee67a3b9af39", "level": "note", "message": {"text": "Legacy-named symbol `conversations_legacy` in apps/web/app/(authed)/admin/page.tsx:27"}, "properties": {"repobilityId": "aac042490fe4c656", "scanner": "scanner-primary", "fingerprint": "ce4bee67a3b9af39", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-27b9c608ddfbdcf7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(authed)/admin/page.tsx:31"}, "properties": {"repobilityId": "54b4531f6da918ae", "scanner": "scanner-primary", "fingerprint": "27b9c608ddfbdcf7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f9c85c3e5325f51", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(authed)/admin/folders/page.tsx:34"}, "properties": {"repobilityId": "52e289f927ed4af1", "scanner": "scanner-primary", "fingerprint": "9f9c85c3e5325f51", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5bf687e4acdd97a8", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/people/people-list.tsx:231"}, "properties": {"repobilityId": "87606f07256ddff8", "scanner": "scanner-primary", "fingerprint": "5bf687e4acdd97a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a29b1b6c61948b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/app/(authed)/people/[id]/page.tsx:75"}, "properties": {"repobilityId": "72be1a7c0209d165", "scanner": "scanner-primary", "fingerprint": "3a29b1b6c61948b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e16ad9e447f3078", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/api.ts:15"}, "properties": {"repobilityId": "43e7c4ded88ff070", "scanner": "scanner-primary", "fingerprint": "1e16ad9e447f3078", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9d2c42ec4b9d13a", "level": "none", "message": {"text": "Commented-code block (9 lines) in packages/db/src/pulse_db/lead_status.py:41"}, "properties": {"repobilityId": "5c318f2038991d7c", "scanner": "scanner-primary", "fingerprint": "d9d2c42ec4b9d13a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b96934ad3dd11540", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/db/src/pulse_db/acl.py:48"}, "properties": {"repobilityId": "5f8a008850f637bc", "scanner": "scanner-primary", "fingerprint": "b96934ad3dd11540", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a87842d5b588a927", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/db/src/pulse_db/cadence_engine.py:277"}, "properties": {"repobilityId": "a711ca53c4adac88", "scanner": "scanner-primary", "fingerprint": "a87842d5b588a927", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ef2b029a8404310", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/db/src/pulse_db/models/broadcast.py:100"}, "properties": {"repobilityId": "6af66f76856be559", "scanner": "scanner-primary", "fingerprint": "8ef2b029a8404310", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2719c6c27cf47838", "level": "note", "message": {"text": "Legacy-named symbol `include_legacy` in packages/db/src/pulse_db/migrations/versions/0021_conversation_per_account.py:10"}, "properties": {"repobilityId": "f1ba28aea8ca8322", "scanner": "scanner-primary", "fingerprint": "2719c6c27cf47838", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-69ad84ff4b78e329", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/db/src/pulse_db/migrations/versions/0010_conversations_people_split.py:57"}, "properties": {"repobilityId": "efdbcc20fa6b56b3", "scanner": "scanner-primary", "fingerprint": "69ad84ff4b78e329", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-814e286b5991c316", "level": "none", "message": {"text": "Commented-code block (9 lines) in packages/schemas/src/pulse_schemas/project.py:60"}, "properties": {"repobilityId": "3962722afeba1bcd", "scanner": "scanner-primary", "fingerprint": "814e286b5991c316", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d6816719f216cb8", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/llm/tests/test_route_resolver.py:24"}, "properties": {"repobilityId": "75c2e6dc40ffbab2", "scanner": "scanner-primary", "fingerprint": "2d6816719f216cb8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d27d1cd976c783a", "level": "none", "message": {"text": "Commented-code block (7 lines) in packages/llm/src/pulse_llm/reply_drafts.py:250"}, "properties": {"repobilityId": "c98f57360296ea0e", "scanner": "scanner-primary", "fingerprint": "7d27d1cd976c783a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c82a3d16b883aecb", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/llm/src/pulse_llm/runs.py:27"}, "properties": {"repobilityId": "0a5fba20d5c5f919", "scanner": "scanner-primary", "fingerprint": "c82a3d16b883aecb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0744b0dfc312f8d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/llm/src/pulse_llm/routes.py:92"}, "properties": {"repobilityId": "3ae631ac76030548", "scanner": "scanner-primary", "fingerprint": "0744b0dfc312f8d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-380b073ef1bd1c04", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/llm/src/pulse_llm/conversation_summary.py:132"}, "properties": {"repobilityId": "3261799f963e7678", "scanner": "scanner-primary", "fingerprint": "380b073ef1bd1c04", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3482f7e5dd70cd1a", "level": "note", "message": {"text": "6 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "1da70f25aa46f6e9", "scanner": "scanner-primary", "fingerprint": "3482f7e5dd70cd1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "b47d851fdea7af6f", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "eaa28dfb10351cfa", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "385b153aff0b47ea", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "7a198d2e2343673d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "49e4d07d38ed022a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5cb6a7f556f3424c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2044703bb4aaa62e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "fc97032d24922c5a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c5caf316c9a7c028", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "99c2bd5aac5e6b11", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "85ae9e3844d3d26c", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "fcacc8d223ec2590", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a1742fff8cc909d6", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "cbc3524f198713c6", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e543a0fec818eab3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6b932ff142c774c5", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d204cfc8d46fe931", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "043ec3968d3b1901", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b1028c833d081842", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-acb123bf8476f828", "level": "error", "message": {"text": "FastAPI POST `registry_refresh` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:160"}, "properties": {"repobilityId": "656ca4db66edee83", "scanner": "scanner-primary", "fingerprint": "acb123bf8476f828", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 160}}}]}, {"ruleId": "scanner-08a72cf35a82b925", "level": "error", "message": {"text": "FastAPI POST `backfill_conversation` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:190"}, "properties": {"repobilityId": "74f6a8f71e552701", "scanner": "scanner-primary", "fingerprint": "08a72cf35a82b925", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 190}}}]}, {"ruleId": "scanner-69c0ac0ac2e61ff3", "level": "error", "message": {"text": "FastAPI POST `sync_dialogs` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:247"}, "properties": {"repobilityId": "3997011e4b32fd0a", "scanner": "scanner-primary", "fingerprint": "69c0ac0ac2e61ff3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-935754997309138d", "level": "error", "message": {"text": "FastAPI POST `send` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:302"}, "properties": {"repobilityId": "80c60a92cf718a0e", "scanner": "scanner-primary", "fingerprint": "935754997309138d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 302}}}]}, {"ruleId": "scanner-d21d2b119417b7ba", "level": "error", "message": {"text": "FastAPI POST `folders_delete` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:352"}, "properties": {"repobilityId": "905881c373ce5ead", "scanner": "scanner-primary", "fingerprint": "d21d2b119417b7ba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 352}}}]}, {"ruleId": "scanner-aa0f127f33d11c15", "level": "error", "message": {"text": "FastAPI POST `folders_resync` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:370"}, "properties": {"repobilityId": "813002a143376824", "scanner": "scanner-primary", "fingerprint": "aa0f127f33d11c15", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 370}}}]}, {"ruleId": "scanner-121123aa20e4e492", "level": "error", "message": {"text": "FastAPI POST `folders_force_scan` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:389"}, "properties": {"repobilityId": "46d3ed28b0b2b095", "scanner": "scanner-primary", "fingerprint": "121123aa20e4e492", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 389}}}]}, {"ruleId": "scanner-d8f7f7d3fc4057ef", "level": "error", "message": {"text": "FastAPI POST `folders_sync_to_tg` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:409"}, "properties": {"repobilityId": "b808c9c56a1d7242", "scanner": "scanner-primary", "fingerprint": "d8f7f7d3fc4057ef", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 409}}}]}, {"ruleId": "scanner-dc5e0c68d11b479a", "level": "error", "message": {"text": "FastAPI POST `ingest_person_dm` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:428"}, "properties": {"repobilityId": "43f9244c4c923d71", "scanner": "scanner-primary", "fingerprint": "dc5e0c68d11b479a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 428}}}]}, {"ruleId": "scanner-df09d354c21d5fde", "level": "error", "message": {"text": "FastAPI POST `ingest_person_dms` without auth dependency \u2014 apps/tg-worker/src/pulse_tg_worker/api.py:470"}, "properties": {"repobilityId": "02d4e9552c542b2b", "scanner": "scanner-primary", "fingerprint": "df09d354c21d5fde", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/tg-worker/src/pulse_tg_worker/api.py"}, "region": {"startLine": 470}}}]}, {"ruleId": "scanner-122637260b4d6f35", "level": "error", "message": {"text": "Dangling fetch: POST /api/active-account (apps/web/components/account-switcher.tsx:75)"}, "properties": {"repobilityId": "dd4acc24bc7ddd43", "scanner": "scanner-primary", "fingerprint": "122637260b4d6f35", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-005482af6bc79ca1", "level": "error", "message": {"text": "Dangling fetch: PUT /api/me/prefs/ai_budget_cap_usd (apps/web/components/settings/my-budget-card.tsx:70)"}, "properties": {"repobilityId": "e0a2733357e79b6d", "scanner": "scanner-primary", "fingerprint": "005482af6bc79ca1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c04d4b0a07192d2", "level": "error", "message": {"text": "Dangling fetch: PUT /api/me/prefs/language (apps/web/components/i18n/language-toggle.tsx:16)"}, "properties": {"repobilityId": "7e98f9c72a267070", "scanner": "scanner-primary", "fingerprint": "0c04d4b0a07192d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7679e335315efa84", "level": "error", "message": {"text": "Dangling fetch: POST /api/projects/${projectId}/members/${personId}/cadence/${action} (apps/web/components/projects/cadence-state-panel.tsx:68)"}, "properties": {"repobilityId": "c974745a25c50f07", "scanner": "scanner-primary", "fingerprint": "7679e335315efa84", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-13f37bb110a3b4e6", "level": "error", "message": {"text": "Dangling fetch: PUT /api/me/prefs/onboarding_dismissed (apps/web/components/dashboard/onboarding-checklist.tsx:53)"}, "properties": {"repobilityId": "ef77479f37a13bb2", "scanner": "scanner-primary", "fingerprint": "13f37bb110a3b4e6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f1506d9986687773", "level": "error", "message": {"text": "Dangling fetch: GET /api/me/prefs/auto_advance_chats (apps/web/components/chats/reply-window.tsx:296)"}, "properties": {"repobilityId": "e2c507cf11fa942a", "scanner": "scanner-primary", "fingerprint": "f1506d9986687773", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-64cd50caa9e3c933", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/ingest/accounts/${a.id}/backfill/${verb} (apps/web/components/admin/IngestDashboard.tsx:115)"}, "properties": {"repobilityId": "a2e6c5bd498203c2", "scanner": "scanner-primary", "fingerprint": "64cd50caa9e3c933", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b6aeedd55cb82b8", "level": "error", "message": {"text": "Dangling fetch: POST /api/broadcasts/${id}/${kind} (apps/web/components/broadcasts/broadcast-detail.tsx:111)"}, "properties": {"repobilityId": "758c83200564f5d7", "scanner": "scanner-primary", "fingerprint": "1b6aeedd55cb82b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b3da7f9b34e686d6", "level": "note", "message": {"text": "Unused endpoint: GET /admin/tg-accounts"}, "properties": {"repobilityId": "f6bf1f3a96755369", "scanner": "scanner-primary", "fingerprint": "b3da7f9b34e686d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-14c93f779cdf408c", "level": "note", "message": {"text": "Unused endpoint: POST /admin/tg-accounts/start"}, "properties": {"repobilityId": "2dc91c1305c9a0ec", "scanner": "scanner-primary", "fingerprint": "14c93f779cdf408c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca6c3ce13188b0e9", "level": "note", "message": {"text": "Unused endpoint: POST /admin/tg-accounts/complete"}, "properties": {"repobilityId": "5b4f6bb13770683e", "scanner": "scanner-primary", "fingerprint": "ca6c3ce13188b0e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28e07aadb481bf52", "level": "note", "message": {"text": "Unused endpoint: POST /admin/tg-accounts/import"}, "properties": {"repobilityId": "fef9b8d013b65225", "scanner": "scanner-primary", "fingerprint": "28e07aadb481bf52", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca8bdb1990003844", "level": "note", "message": {"text": "Unused endpoint: GET /projects/starters"}, "properties": {"repobilityId": "784fff3fb10e50c5", "scanner": "scanner-primary", "fingerprint": "ca8bdb1990003844", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8276e9a42f5cb13a", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{project_id}"}, "properties": {"repobilityId": "aad2a7c9f26c10ef", "scanner": "scanner-primary", "fingerprint": "8276e9a42f5cb13a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-deb769b9b73d9d9a", "level": "note", "message": {"text": "Unused endpoint: POST /projects/{project_id}/members/{person_id}/draft"}, "properties": {"repobilityId": "e207291249f8b638", "scanner": "scanner-primary", "fingerprint": "deb769b9b73d9d9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb2696c6d7d57c46", "level": "note", "message": {"text": "Unused endpoint: GET /admin/tg-accounts/{account_id}/access"}, "properties": {"repobilityId": "a5e9b8bf834115b3", "scanner": "scanner-primary", "fingerprint": "fb2696c6d7d57c46", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d6d99da1d63def92", "level": "note", "message": {"text": "Unused endpoint: POST /admin/tg-accounts/{account_id}/access"}, "properties": {"repobilityId": "dfef6a5923959e0b", "scanner": "scanner-primary", "fingerprint": "d6d99da1d63def92", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de19a6915c03a660", "level": "note", "message": {"text": "Unused endpoint: POST /admin/tg-accounts/{account_id}/access/bulk"}, "properties": {"repobilityId": "9f0b23f79461025a", "scanner": "scanner-primary", "fingerprint": "de19a6915c03a660", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c1cd8e10a2ba4f80", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/tg-accounts/{account_id}/access/{user_id}"}, "properties": {"repobilityId": "cb4bf28fded2fa24", "scanner": "scanner-primary", "fingerprint": "c1cd8e10a2ba4f80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-89dfa27bb779667f", "level": "note", "message": {"text": "Unused endpoint: GET /limits/usage"}, "properties": {"repobilityId": "fcd0db90d3500920", "scanner": "scanner-primary", "fingerprint": "89dfa27bb779667f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-071e5e39d226a0e1", "level": "note", "message": {"text": "Unused endpoint: GET /admin/folders/{folder_id}/access"}, "properties": {"repobilityId": "aa28d09b253729b0", "scanner": "scanner-primary", "fingerprint": "071e5e39d226a0e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-22af08ca76b25231", "level": "note", "message": {"text": "Unused endpoint: POST /admin/folders/{folder_id}/access"}, "properties": {"repobilityId": "970481fff956ceec", "scanner": "scanner-primary", "fingerprint": "22af08ca76b25231", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9745b1da7fae4097", "level": "note", "message": {"text": "Unused endpoint: POST /admin/folders/{folder_id}/access/bulk"}, "properties": {"repobilityId": "b0812c948c96ed14", "scanner": "scanner-primary", "fingerprint": "9745b1da7fae4097", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b7d0d836aae2102", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/folders/{folder_id}/access/{user_id}"}, "properties": {"repobilityId": "5ddab1c844899289", "scanner": "scanner-primary", "fingerprint": "8b7d0d836aae2102", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7013fe53d49658f", "level": "note", "message": {"text": "Unused endpoint: GET /admin/people/{person_id}/access"}, "properties": {"repobilityId": "c5c6ab5c481dc179", "scanner": "scanner-primary", "fingerprint": "a7013fe53d49658f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-475d1867764701ba", "level": "note", "message": {"text": "Unused endpoint: POST /admin/people/{person_id}/access"}, "properties": {"repobilityId": "665b370576b0f95d", "scanner": "scanner-primary", "fingerprint": "475d1867764701ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-347df7edea354edd", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/people/{person_id}/access/{user_id}"}, "properties": {"repobilityId": "c38b0401ce82942c", "scanner": "scanner-primary", "fingerprint": "347df7edea354edd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1119b37cf9dcbe55", "level": "note", "message": {"text": "Unused endpoint: GET /admin/org-settings"}, "properties": {"repobilityId": "019be5c80138a436", "scanner": "scanner-primary", "fingerprint": "1119b37cf9dcbe55", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b06433c5e3b1f45", "level": "note", "message": {"text": "Unused endpoint: GET /me/tg-accounts"}, "properties": {"repobilityId": "23ed6b870fc18997", "scanner": "scanner-primary", "fingerprint": "3b06433c5e3b1f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54d75d84e59c5354", "level": "note", "message": {"text": "Unused endpoint: GET /me/tg-accounts/mine"}, "properties": {"repobilityId": "4cae7b50912e7a5b", "scanner": "scanner-primary", "fingerprint": "54d75d84e59c5354", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d1c0d1393e8e3ca", "level": "note", "message": {"text": "Unused endpoint: POST /me/tg-accounts/start"}, "properties": {"repobilityId": "87573ebdedca02d2", "scanner": "scanner-primary", "fingerprint": "8d1c0d1393e8e3ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-acf4e6729f438e64", "level": "note", "message": {"text": "Unused endpoint: POST /me/tg-accounts/complete"}, "properties": {"repobilityId": "82f6af66894f3236", "scanner": "scanner-primary", "fingerprint": "acf4e6729f438e64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6327e7d63f12d827", "level": "note", "message": {"text": "Unused endpoint: GET /contacts"}, "properties": {"repobilityId": "23b91eb6bc6e6b84", "scanner": "scanner-primary", "fingerprint": "6327e7d63f12d827", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-14298e77527b7350", "level": "note", "message": {"text": "Unused endpoint: GET /contacts/search"}, "properties": {"repobilityId": "0d02bd4f645e6908", "scanner": "scanner-primary", "fingerprint": "14298e77527b7350", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c03a22ce5bc1852c", "level": "note", "message": {"text": "Unused endpoint: GET /contacts/{contact_id}"}, "properties": {"repobilityId": "d2885cf27e8bfe80", "scanner": "scanner-primary", "fingerprint": "c03a22ce5bc1852c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2888db7d2e5263c1", "level": "note", "message": {"text": "Unused endpoint: GET /ai/catalogue"}, "properties": {"repobilityId": "2b13d8faed3d3081", "scanner": "scanner-primary", "fingerprint": "2888db7d2e5263c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-328e124dd270b043", "level": "note", "message": {"text": "Unused endpoint: GET /ai/routes"}, "properties": {"repobilityId": "83c3127c64dad107", "scanner": "scanner-primary", "fingerprint": "328e124dd270b043", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0db4ad88900d68ac", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard/next-actions"}, "properties": {"repobilityId": "c7b670b329d9534b", "scanner": "scanner-primary", "fingerprint": "0db4ad88900d68ac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdfddec1bc196588", "level": "note", "message": {"text": "Unused endpoint: POST /conversations/sync"}, "properties": {"repobilityId": "4e6bac8079ee324b", "scanner": "scanner-primary", "fingerprint": "cdfddec1bc196588", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9de5418a1c08e9a", "level": "note", "message": {"text": "Unused endpoint: POST /conversations/{conversation_id}/summarize"}, "properties": {"repobilityId": "35945a767a34a99a", "scanner": "scanner-primary", "fingerprint": "b9de5418a1c08e9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7fac25f11f5b4cd5", "level": "note", "message": {"text": "Unused endpoint: GET /conversations/{conversation_id}/attachments/{attachment_id}"}, "properties": {"repobilityId": "065c0f4dfc6006e2", "scanner": "scanner-primary", "fingerprint": "7fac25f11f5b4cd5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-480e46fcd71f652a", "level": "note", "message": {"text": "Unused endpoint: GET /conversations/{conversation_id}/members"}, "properties": {"repobilityId": "ba5262c87f95f937", "scanner": "scanner-primary", "fingerprint": "480e46fcd71f652a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37dcfe85640bc76d", "level": "note", "message": {"text": "Unused endpoint: GET /conversations/{conversation_id}/topics"}, "properties": {"repobilityId": "58dfcf1919e908dc", "scanner": "scanner-primary", "fingerprint": "37dcfe85640bc76d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e564e6b2d07ea75e", "level": "note", "message": {"text": "Unused endpoint: GET /admin/conversations/{conversation_id}/access"}, "properties": {"repobilityId": "0b0276de11eea749", "scanner": "scanner-primary", "fingerprint": "e564e6b2d07ea75e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d608d14eed654dc", "level": "note", "message": {"text": "Unused endpoint: POST /admin/conversations/{conversation_id}/access"}, "properties": {"repobilityId": "35331232ea9c1427", "scanner": "scanner-primary", "fingerprint": "8d608d14eed654dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-259b15b1a71d5061", "level": "note", "message": {"text": "Unused endpoint: POST /admin/conversations/{conversation_id}/access/bulk"}, "properties": {"repobilityId": "7b92a33d3e0fa004", "scanner": "scanner-primary", "fingerprint": "259b15b1a71d5061", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c4f5fac237934ec", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/conversations/{conversation_id}/access/{user_id}"}, "properties": {"repobilityId": "602edca1e05a9c3a", "scanner": "scanner-primary", "fingerprint": "0c4f5fac237934ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-060f5b37ce1343c6", "level": "note", "message": {"text": "Unused endpoint: GET /conversations/{conversation_id}/summary"}, "properties": {"repobilityId": "6232bbf8e3477628", "scanner": "scanner-primary", "fingerprint": "060f5b37ce1343c6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc3887ecd92805a4", "level": "note", "message": {"text": "Unused endpoint: GET /digest/today"}, "properties": {"repobilityId": "d4670845bf487d58", "scanner": "scanner-primary", "fingerprint": "cc3887ecd92805a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc6f248c116df03d", "level": "note", "message": {"text": "Unused endpoint: GET /cadence/starters"}, "properties": {"repobilityId": "cb025e7e682657cc", "scanner": "scanner-primary", "fingerprint": "cc6f248c116df03d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e8709b459c2d420", "level": "note", "message": {"text": "Unused endpoint: POST /projects/{project_id}/cadence/lint"}, "properties": {"repobilityId": "81d756dc2d9fe3cf", "scanner": "scanner-primary", "fingerprint": "8e8709b459c2d420", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98220e6989d2ec27", "level": "note", "message": {"text": "Unused endpoint: POST /projects/{project_id}/members/{person_id}/cadence/start"}, "properties": {"repobilityId": "8fd10781f15e9345", "scanner": "scanner-primary", "fingerprint": "98220e6989d2ec27", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f68e2f172849a9f", "level": "note", "message": {"text": "Unused endpoint: POST /projects/{project_id}/members/{person_id}/cadence/pause"}, "properties": {"repobilityId": "c3c8882594e7d1c9", "scanner": "scanner-primary", "fingerprint": "7f68e2f172849a9f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-34ab21e63a0a5e9e", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{project_id}/cadence/state"}, "properties": {"repobilityId": "0b2362429e11ae5e", "scanner": "scanner-primary", "fingerprint": "34ab21e63a0a5e9e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7db669e94f66c8b5", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{project_id}/cadence/transitions"}, "properties": {"repobilityId": "f3ce8b7eeb18faa0", "scanner": "scanner-primary", "fingerprint": "7db669e94f66c8b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd0e06afbaab19b3", "level": "note", "message": {"text": "Unused endpoint: GET /tasks"}, "properties": {"repobilityId": "ee3f7d255e19ac56", "scanner": "scanner-primary", "fingerprint": "fd0e06afbaab19b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-78d4d9ba50d6c996", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/count"}, "properties": {"repobilityId": "3418a70ffb6f6c1a", "scanner": "scanner-primary", "fingerprint": "78d4d9ba50d6c996", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af452444bd69963c", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/stats"}, "properties": {"repobilityId": "a706649a9d7864ff", "scanner": "scanner-primary", "fingerprint": "af452444bd69963c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}