{"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-602e181a67cf7aab", "name": "Possibly dead Python function: progress", "shortDescription": {"text": "Possibly dead Python function: progress"}, "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-dd5a1f7d7b392d14", "name": "Possibly dead Python function: progress_cb", "shortDescription": {"text": "Possibly dead Python function: progress_cb"}, "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-4cad628223f3cf1b", "name": "Possibly dead Python function: progress", "shortDescription": {"text": "Possibly dead Python function: progress"}, "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-81a1eac7fc6f1aa2", "name": "Possibly dead Python function: verify_email_smtp", "shortDescription": {"text": "Possibly dead Python function: verify_email_smtp"}, "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-f03ebe3e5dfb3646", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "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-163b9ba24b699b6c", "name": "Possibly dead Python function: add_request_id", "shortDescription": {"text": "Possibly dead Python function: add_request_id"}, "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-c204b39b4b09c824", "name": "Possibly dead Python function: replace_link", "shortDescription": {"text": "Possibly dead Python function: replace_link"}, "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-acc58cd512d43886", "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-06d587023b64589f", "name": "Possibly dead Python function: search_by_address", "shortDescription": {"text": "Possibly dead Python function: search_by_address"}, "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-b83a13d023e4572e", "name": "Possibly dead Python function: check_batch", "shortDescription": {"text": "Possibly dead Python function: check_batch"}, "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-843f625d8d3abb27", "name": "Possibly dead Python function: create_contact", "shortDescription": {"text": "Possibly dead Python function: create_contact"}, "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-68d04b49c7831ad8", "name": "Possibly dead Python function: update_lead_status", "shortDescription": {"text": "Possibly dead Python function: update_lead_status"}, "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-42535e8fb9a1f25f", "name": "Possibly dead Python function: search_contacts_by_email", "shortDescription": {"text": "Possibly dead Python function: search_contacts_by_email"}, "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-909d160da3747f8e", "name": "Possibly dead Python function: sync_reply_to_close", "shortDescription": {"text": "Possibly dead Python function: sync_reply_to_close"}, "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-a7572d700315023d", "name": "Possibly dead Python function: sync_open_to_close", "shortDescription": {"text": "Possibly dead Python function: sync_open_to_close"}, "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-d9467115faf65f37", "name": "Possibly dead Python function: sync_click_to_close", "shortDescription": {"text": "Possibly dead Python function: sync_click_to_close"}, "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-87d2a25cee3c39a7", "name": "Possibly dead Python function: sync_bounce_to_close", "shortDescription": {"text": "Possibly dead Python function: sync_bounce_to_close"}, "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-5981691054706077", "name": "Possibly dead Python function: sync_meeting_to_close", "shortDescription": {"text": "Possibly dead Python function: sync_meeting_to_close"}, "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-382fef93c5405e16", "name": "Possibly dead Python function: replace_var", "shortDescription": {"text": "Possibly dead Python function: replace_var"}, "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-950ff173076b3616", "name": "Possibly dead Python function: enrich_leads_csv", "shortDescription": {"text": "Possibly dead Python function: enrich_leads_csv"}, "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-9dee3d85c981c0ae", "name": "Possibly dead Python function: initiate_call", "shortDescription": {"text": "Possibly dead Python function: initiate_call"}, "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-059adb0eba3f1c8c", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/App.jsx:395", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/App.jsx:395"}, "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-299fc193576b48b5", "name": "Stray `console.log` in TS/JS \u2014 dashboard/src/hooks/useWebexCalling.js:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 dashboard/src/hooks/useWebexCalling.js:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c040fd3cf60d2ffd", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/DashboardPage.jsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/DashboardPage.jsx:69"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-657c623b8eb616e0", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/EmailThread.jsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/EmailThread.jsx:33"}, "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-9c6e3fc54014485e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/components/EmailThread.jsx:54", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/components/EmailThread.jsx:54"}, "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-2976bbc812ca63a3", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/CallHandler.jsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/CallHandler.jsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24cd3cfd9a00f187", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/AddCardModal.jsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/AddCardModal.jsx:139"}, "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-28c4d751756cebd6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/components/EmailComposer.jsx:230", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/components/EmailComposer.jsx:230"}, "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-763e8fb7a5927eec", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/EmailsSection.jsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/EmailsSection.jsx:102"}, "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-000b1c0c2ba35e0f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/components/EmailsSection.jsx:140", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/components/EmailsSection.jsx:140"}, "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-39190c2234fb73f7", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/DocumentsSection.jsx:252", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/DocumentsSection.jsx:252"}, "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-21ace4c8fcd7f2bd", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/StatCard.jsx:23", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/StatCard.jsx:23"}, "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-4682e9dd22eb876c", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/SentEmails.jsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/SentEmails.jsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-82fe3336e01868b6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/SentEmails.jsx:104", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/SentEmails.jsx:104"}, "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-2e8007bb074309ad", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/LeadScraper.jsx:415", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/LeadScraper.jsx:415"}, "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-7a65a0f6cb3dcb26", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CampaignDetail.jsx:176", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CampaignDetail.jsx:176"}, "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-93b8ca883df2cf55", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CRMPipeline.jsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CRMPipeline.jsx:53"}, "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-9c5d729f36e890c1", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Overview.jsx:267", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Overview.jsx:267"}, "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-a93645a4f5d23f66", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/DialerPage.jsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/DialerPage.jsx:257"}, "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-1e47ea79a9a9ec0c", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/KontaktDetail.jsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/KontaktDetail.jsx:160"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de5f8f89e75f95ab", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/KontaktDetail.jsx:1097", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/KontaktDetail.jsx:1097"}, "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-90886971b2444ee5", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CampaignCreate.jsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CampaignCreate.jsx:225"}, "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-8f1160574bb3c60d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CampaignCreate.jsx:368", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CampaignCreate.jsx:368"}, "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-0e912af2e9c3fce8", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Aufgaben.jsx:272", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Aufgaben.jsx:272"}, "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-2ba7bb28aa0dea94", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/Aufgaben.jsx:282", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/Aufgaben.jsx:282"}, "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-e1e532387b39fdb0", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CRMSettings.jsx:892", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CRMSettings.jsx:892"}, "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-5ded8c10c6336f5c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CRMSettings.jsx:610", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CRMSettings.jsx:610"}, "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-237e667bf4564d9c", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/DealDetail.jsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/DealDetail.jsx:201"}, "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-877ab4c4a54b1bd0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/DealDetail.jsx:1526", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/DealDetail.jsx:1526"}, "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-4a20109920ebb15c", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/LeadsUnified.jsx:782", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/LeadsUnified.jsx:782"}, "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-349e21045e444b3b", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CRMInbox.jsx:299", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CRMInbox.jsx:299"}, "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-8f05480e55d78fc5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CRMInbox.jsx:444", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CRMInbox.jsx:444"}, "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-f3778e710335ce85", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Organisationen.jsx:273", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Organisationen.jsx:273"}, "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-f74521af325ed413", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Projekte.jsx:482", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Projekte.jsx:482"}, "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-0eb60cf6d819d54f", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/KundenDetail.jsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/KundenDetail.jsx:173"}, "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-125a21208e6749c5", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Leads.jsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Leads.jsx:279"}, "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-59268ddea2180de8", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Kalender.jsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Kalender.jsx:110"}, "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-565e3cc7d17aa420", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/OrganisationDetail.jsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/OrganisationDetail.jsx:250"}, "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-100246231f7a9b60", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/OrganisationDetail.jsx:395", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/OrganisationDetail.jsx:395"}, "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-d7d72d5b1a3cae15", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Kunden.jsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Kunden.jsx:50"}, "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-eae71755c484b91f", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Finanzen.jsx:311", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Finanzen.jsx:311"}, "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-661c8d9a74e72032", "name": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/WebAnalytics.jsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/WebAnalytics.jsx:103"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-556d07aa56dc4d81", "name": "Privileged port 465 in use", "shortDescription": {"text": "Privileged port 465 in use"}, "fullDescription": {"text": "Port 465 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-440b41e3eac85abb", "name": "Privileged port 993 in use", "shortDescription": {"text": "Privileged port 993 in use"}, "fullDescription": {"text": "Port 993 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8987d6d1c30c7202", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "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-de3c1f217d72a063", "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-8ddae01d7cd3ffa9", "name": "Insecure pattern 'tls_verify_false' in agents/website_fetcher.py:55", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in agents/website_fetcher.py:55"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4416ffe15126b675", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/components/EmailThread.jsx:54", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/components/EmailThread.jsx:54"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65f9a5098d788550", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/components/EmailComposer.jsx:230", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/components/EmailComposer.jsx:230"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9c66197489c8fe2e", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/components/EmailsSection.jsx:140", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/components/EmailsSection.jsx:140"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-319c285ea5ff64ea", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/SentEmails.jsx:104", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/SentEmails.jsx:104"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4d2958dd08647365", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CampaignDetail.jsx:176", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CampaignDetail.jsx:176"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d11868770f0bc378", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/KontaktDetail.jsx:1097", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/KontaktDetail.jsx:1097"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6a464f1fb7087837", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CampaignCreate.jsx:368", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CampaignCreate.jsx:368"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6b755f39120301e4", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/Aufgaben.jsx:282", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/Aufgaben.jsx:282"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-44292ab05d5ae555", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CRMSettings.jsx:610", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CRMSettings.jsx:610"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-40a0d35d81d59387", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/DealDetail.jsx:1526", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/DealDetail.jsx:1526"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-05dd2fcb2e619c76", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CRMInbox.jsx:444", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CRMInbox.jsx:444"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6d73ad6c0741c2f0", "name": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/OrganisationDetail.jsx:395", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/OrganisationDetail.jsx:395"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2e545d8632a0a19", "name": "Very large file: dashboard/src/pages/KontaktDetail.jsx (1935 lines)", "shortDescription": {"text": "Very large file: dashboard/src/pages/KontaktDetail.jsx (1935 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-01ae35581baae1c5", "name": "Very large file: dashboard/src/pages/CRMSettings.jsx (2062 lines)", "shortDescription": {"text": "Very large file: dashboard/src/pages/CRMSettings.jsx (2062 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-cd6497198066d7e5", "name": "Very large file: dashboard/src/pages/DealDetail.jsx (1983 lines)", "shortDescription": {"text": "Very large file: dashboard/src/pages/DealDetail.jsx (1983 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-cd125d7f76c93cdf", "name": "Very large file: dashboard/src/pages/LeadsUnified.jsx (1282 lines)", "shortDescription": {"text": "Very large file: dashboard/src/pages/LeadsUnified.jsx (1282 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7858bfead9526fee", "name": "Very large file: app/api/test_email.py (2127 lines)", "shortDescription": {"text": "Very large file: app/api/test_email.py (2127 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "22 test file(s) for 271 source file(s) (ratio 0.08). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 666 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 151 placeholder/mock markers across 30 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. 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-be83ecad498b0402", "name": "Legacy-named symbol `cache_sample_1000_v2` in run_score_1000_v2.py:15", "shortDescription": {"text": "Legacy-named symbol `cache_sample_1000_v2` in run_score_1000_v2.py:15"}, "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-0e049ed5633bc628", "name": "Legacy-named symbol `lead_pipeline_v2` in agents/lead_pipeline_v2.py:14", "shortDescription": {"text": "Legacy-named symbol `lead_pipeline_v2` in agents/lead_pipeline_v2.py:14"}, "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-d3a34d97c47c3cf7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/App.jsx:182", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/App.jsx:182"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e2216cb73693e1d2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/utils/api.js:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/utils/api.js:147"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1f7b8642dc4c1bf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/components/DashboardPage.jsx:213", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/components/DashboardPage.jsx:213"}, "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-84ed5a405db226af", "name": "Commented-code block (5 lines) in dashboard/src/components/CallHandler.jsx:70", "shortDescription": {"text": "Commented-code block (5 lines) in dashboard/src/components/CallHandler.jsx:70"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-edc5fa555bff4bff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/pages/CloseCRM.jsx:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/pages/CloseCRM.jsx:7"}, "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-7cfc346c2e1ef28c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/pages/WebAnalytics.jsx:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/pages/WebAnalytics.jsx:12"}, "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-77da9400ed12ff33", "name": "Commented-code block (6 lines) in app/main.py:54", "shortDescription": {"text": "Commented-code block (6 lines) in app/main.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-4ea146e7276a3f63", "name": "Legacy-named symbol `lead_pipeline_v2` in app/api/scraper.py:127", "shortDescription": {"text": "Legacy-named symbol `lead_pipeline_v2` in app/api/scraper.py:127"}, "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-18120a6430ec5f44", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/branche_backfill.py:51", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/branche_backfill.py:51"}, "fullDescription": {"text": "`urllib.request.urlopen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65df07ab4020db79", "name": "18 env vars used in code but missing from .env.example", "shortDescription": {"text": "18 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DASHBOARD_URL`, `DRY`, `EXT_PREFIX`, `GOOGLE_API_KEY`, `GOOGLE_CSE_ID`, `GOOGLE_MAPS_API_KEY`, `GOOGLE_SERVICE_ACCOUNT_JSON`, `MILLIONVERIFIER_API_KEY` + 10 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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:\napp/main.py:serve_dashboard_root, app/main.py:serve_dashboard\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:\napp/api/projects.py:get_projects_by_customer, app/api/projects.py:get_projects, app/api/projects.py:get_project\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-64545ea3a3de45cd", "name": "Frontend route `/kunden/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/kunden/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2be9a37c6356cba3", "name": "Frontend route `/crm/organisationen/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/crm/organisationen/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b63ca8b264028cef", "name": "Frontend route `/crm/kontakte/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/crm/kontakte/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f86d209f008bf765", "name": "Frontend route `/crm/deals/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/crm/deals/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7da7fbc186accf03", "name": "Frontend route `/crm/rechnungen` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/crm/rechnungen` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5c9307469b63aed3", "name": "Frontend route `/antworten` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/antworten` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8cb0406b7de20bfe", "name": "Frontend route `/campaigns/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/campaigns/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d374034efa6c08b6", "name": "Frontend route `/leads` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/leads` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b3b2656a7ad01e0c", "name": "Frontend route `/accounts` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/accounts` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d525d1821cb56d2", "name": "Frontend route `/close` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/close` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c34478cb62369a8a", "name": "Frontend route `/scraper` has no Link/navigate to it \u2014 dashboard/src/App.jsx", "shortDescription": {"text": "Frontend route `/scraper` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b28f517a2cb514bb", "name": "FastAPI POST `migrate_columns` without auth dependency \u2014 app/api/crm_setup.py:329", "shortDescription": {"text": "FastAPI POST `migrate_columns` without auth dependency \u2014 app/api/crm_setup.py:329"}, "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-b0e03dc900b0f72e", "name": "FastAPI POST `confirm_unsubscribe` without auth dependency \u2014 app/api/tracking.py:106", "shortDescription": {"text": "FastAPI POST `confirm_unsubscribe` without auth dependency \u2014 app/api/tracking.py:106"}, "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-ec7a39f9f2008670", "name": "FastAPI POST `track_pageview` without auth dependency \u2014 app/api/analytics.py:88", "shortDescription": {"text": "FastAPI POST `track_pageview` without auth dependency \u2014 app/api/analytics.py:88"}, "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-644ca68f38f6df33", "name": "FastAPI POST `track_click` without auth dependency \u2014 app/api/analytics.py:120", "shortDescription": {"text": "FastAPI POST `track_click` without auth dependency \u2014 app/api/analytics.py:120"}, "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-376867e43dba71a6", "name": "FastAPI POST `track_scroll` without auth dependency \u2014 app/api/analytics.py:147", "shortDescription": {"text": "FastAPI POST `track_scroll` without auth dependency \u2014 app/api/analytics.py:147"}, "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-d6c99849e93a6ce0", "name": "FastAPI POST `preview_csv` without auth dependency \u2014 app/api/leads.py:65", "shortDescription": {"text": "FastAPI POST `preview_csv` without auth dependency \u2014 app/api/leads.py:65"}, "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-bc749ee8d4bedc23", "name": "FastAPI POST `enrich_leads_csv` without auth dependency \u2014 app/api/leads.py:441", "shortDescription": {"text": "FastAPI POST `enrich_leads_csv` without auth dependency \u2014 app/api/leads.py:441"}, "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-7acf4756d05bf813", "name": "FastAPI POST `import_from_close` without auth dependency \u2014 app/api/close_crm.py:37", "shortDescription": {"text": "FastAPI POST `import_from_close` without auth dependency \u2014 app/api/close_crm.py:37"}, "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-0aef0423776b987b", "name": "FastAPI POST `push_to_close` without auth dependency \u2014 app/api/close_crm.py:55", "shortDescription": {"text": "FastAPI POST `push_to_close` without auth dependency \u2014 app/api/close_crm.py:55"}, "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-8cc06c7eed3d48f4", "name": "FastAPI POST `sync_activities` without auth dependency \u2014 app/api/close_crm.py:72", "shortDescription": {"text": "FastAPI POST `sync_activities` without auth dependency \u2014 app/api/close_crm.py:72"}, "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-cf12a208c2b9a6e7", "name": "FastAPI POST `push_call_priority` without auth dependency \u2014 app/api/close_crm.py:136", "shortDescription": {"text": "FastAPI POST `push_call_priority` without auth dependency \u2014 app/api/close_crm.py:136"}, "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-a840c4cdb2f25a30", "name": "FastAPI POST `start_scraping` without auth dependency \u2014 app/api/scraper.py:56", "shortDescription": {"text": "FastAPI POST `start_scraping` without auth dependency \u2014 app/api/scraper.py:56"}, "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-cc527ac6b42e2a9b", "name": "FastAPI POST `update_job_progress` without auth dependency \u2014 app/api/scraper.py:307", "shortDescription": {"text": "FastAPI POST `update_job_progress` without auth dependency \u2014 app/api/scraper.py:307"}, "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-e8879a224d892611", "name": "FastAPI POST `complete_job` without auth dependency \u2014 app/api/scraper.py:326", "shortDescription": {"text": "FastAPI POST `complete_job` without auth dependency \u2014 app/api/scraper.py:326"}, "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-e2cd3b3a48a38999", "name": "FastAPI POST `fail_job` without auth dependency \u2014 app/api/scraper.py:344", "shortDescription": {"text": "FastAPI POST `fail_job` without auth dependency \u2014 app/api/scraper.py:344"}, "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-c1c108978bf92e94", "name": "FastAPI POST `upload_scraped_leads` without auth dependency \u2014 app/api/scraper.py:361", "shortDescription": {"text": "FastAPI POST `upload_scraped_leads` without auth dependency \u2014 app/api/scraper.py:361"}, "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-05cb9c81aeb6c116", "name": "FastAPI POST `upload_results` without auth dependency \u2014 app/api/scraper.py:370", "shortDescription": {"text": "FastAPI POST `upload_results` without auth dependency \u2014 app/api/scraper.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-2d0dd15d06439b5f", "name": "FastAPI POST `import_leads_from_job` without auth dependency \u2014 app/api/scraper.py:398", "shortDescription": {"text": "FastAPI POST `import_leads_from_job` without auth dependency \u2014 app/api/scraper.py:398"}, "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-2e6f54e73d3d58f8", "name": "FastAPI POST `personalize_leads` without auth dependency \u2014 app/api/scraper.py:510", "shortDescription": {"text": "FastAPI POST `personalize_leads` without auth dependency \u2014 app/api/scraper.py:510"}, "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-8a33c15fa5f5f0bf", "name": "FastAPI DELETE `delete_job` without auth dependency \u2014 app/api/scraper.py:553", "shortDescription": {"text": "FastAPI DELETE `delete_job` without auth dependency \u2014 app/api/scraper.py:553"}, "fullDescription": {"text": "`@router.delete` 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-87e62b66e1d4c6b2", "name": "FastAPI POST `replay_dlq_entry` without auth dependency \u2014 app/api/ops.py:53", "shortDescription": {"text": "FastAPI POST `replay_dlq_entry` without auth dependency \u2014 app/api/ops.py:53"}, "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-6372794103c72df6", "name": "FastAPI POST `preview_crm_leads_csv` without auth dependency \u2014 app/api/crm/leads_unified.py:487", "shortDescription": {"text": "FastAPI POST `preview_crm_leads_csv` without auth dependency \u2014 app/api/crm/leads_unified.py:487"}, "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-523c7e26f1700e6b", "name": "Dangling fetch: GET /api/auth/check (dashboard/src/App.jsx:182)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/check (dashboard/src/App.jsx:182)"}, "fullDescription": {"text": "`dashboard/src/App.jsx:182` calls `GET /api/auth/check` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/check`\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-faadcc7fb5c087ef", "name": "Dangling fetch: POST /api/auth/logout (dashboard/src/App.jsx:221)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/logout (dashboard/src/App.jsx:221)"}, "fullDescription": {"text": "`dashboard/src/App.jsx:221` calls `POST /api/auth/logout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/logout`\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-d6d2659f6851750e", "name": "Dangling fetch: PATCH /api/campaigns/${id}/steps/${editingStep.stepId} (dashboard/src/pages/CampaignDetail.jsx:35)", "shortDescription": {"text": "Dangling fetch: PATCH /api/campaigns/${id}/steps/${editingStep.stepId} (dashboard/src/pages/CampaignDetail.jsx:35)"}, "fullDescription": {"text": "`dashboard/src/pages/CampaignDetail.jsx:35` calls `PATCH /api/campaigns/${id}/steps/${editingStep.stepId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/campaigns/<p>/steps/<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-617f0d2a0d415cdc", "name": "Dangling fetch: DELETE /api/campaigns/${id}/steps/${stepId} (dashboard/src/pages/CampaignDetail.jsx:52)", "shortDescription": {"text": "Dangling fetch: DELETE /api/campaigns/${id}/steps/${stepId} (dashboard/src/pages/CampaignDetail.jsx:52)"}, "fullDescription": {"text": "`dashboard/src/pages/CampaignDetail.jsx:52` calls `DELETE /api/campaigns/${id}/steps/${stepId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/campaigns/<p>/steps/<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-a6ef74a23a329c39", "name": "Dangling fetch: PATCH /api/campaigns/${id}/variants/${editingVariant.variantId} (dashboard/src/pages/CampaignDetail.jsx:", "shortDescription": {"text": "Dangling fetch: PATCH /api/campaigns/${id}/variants/${editingVariant.variantId} (dashboard/src/pages/CampaignDetail.jsx:66)"}, "fullDescription": {"text": "`dashboard/src/pages/CampaignDetail.jsx:66` calls `PATCH /api/campaigns/${id}/variants/${editingVariant.variantId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/campaigns/<p>/variants/<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-2a685e91490a19e1", "name": "Dangling fetch: POST /api/auth/login (dashboard/src/pages/Login.jsx:18)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login (dashboard/src/pages/Login.jsx:18)"}, "fullDescription": {"text": "`dashboard/src/pages/Login.jsx:18` calls `POST /api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/login`\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-933af97987a85fca", "name": "Dangling fetch: GET /api/auth/invite-info?token=${token} (dashboard/src/pages/Register.jsx:22)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/invite-info?token=${token} (dashboard/src/pages/Register.jsx:22)"}, "fullDescription": {"text": "`dashboard/src/pages/Register.jsx:22` calls `GET /api/auth/invite-info?token=${token}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/invite-info`\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-8312c308f85a9156", "name": "Dangling fetch: POST /api/auth/register (dashboard/src/pages/Register.jsx:73)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/register (dashboard/src/pages/Register.jsx:73)"}, "fullDescription": {"text": "`dashboard/src/pages/Register.jsx:73` calls `POST /api/auth/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/register`\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-bb9f03f72901732d", "name": "Dangling fetch: GET /api/analytics${path} (dashboard/src/pages/WebAnalytics.jsx:12)", "shortDescription": {"text": "Dangling fetch: GET /api/analytics${path} (dashboard/src/pages/WebAnalytics.jsx:12)"}, "fullDescription": {"text": "`dashboard/src/pages/WebAnalytics.jsx:12` calls `GET /api/analytics${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analytics/<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-5bf5530d66d680a8", "name": "Unused endpoint: GET /dashboard/", "shortDescription": {"text": "Unused endpoint: GET /dashboard/"}, "fullDescription": {"text": "`app/main.py` declares `GET /dashboard/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d504b80adc9409ec", "name": "Unused endpoint: GET /dashboard", "shortDescription": {"text": "Unused endpoint: GET /dashboard"}, "fullDescription": {"text": "`app/main.py` declares `GET /dashboard` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-775488fce1c65fad", "name": "Unused endpoint: GET /dashboard/{path:path}", "shortDescription": {"text": "Unused endpoint: GET /dashboard/{path:path}"}, "fullDescription": {"text": "`app/main.py` declares `GET /dashboard/{path:path}` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`app/main.py` declares `GET /` 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-d35af6caad69ba7f", "name": "Unused endpoint: GET /dynvon-kmu-outreach", "shortDescription": {"text": "Unused endpoint: GET /dynvon-kmu-outreach"}, "fullDescription": {"text": "`app/api/templates.py` declares `GET /dynvon-kmu-outreach` 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-3b9d5e02b2505ca9", "name": "Unused endpoint: POST /dynvon-kmu-outreach/create", "shortDescription": {"text": "Unused endpoint: POST /dynvon-kmu-outreach/create"}, "fullDescription": {"text": "`app/api/templates.py` declares `POST /dynvon-kmu-outreach/create` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`app/api/tasks.py` declares `POST /` 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-cecf400c02427097", "name": "Unused endpoint: PATCH /{task_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{task_id}"}, "fullDescription": {"text": "`app/api/tasks.py` declares `PATCH /{task_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-9c055f3f8f83ed5f", "name": "Unused endpoint: DELETE /{task_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{task_id}"}, "fullDescription": {"text": "`app/api/tasks.py` declares `DELETE /{task_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-2d40c422e2f65595", "name": "Unused endpoint: PATCH /{task_id}/move", "shortDescription": {"text": "Unused endpoint: PATCH /{task_id}/move"}, "fullDescription": {"text": "`app/api/tasks.py` declares `PATCH /{task_id}/move` 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-f3c4eb974e4684dd", "name": "Unused endpoint: POST /seed", "shortDescription": {"text": "Unused endpoint: POST /seed"}, "fullDescription": {"text": "`app/api/crm_setup.py` declares `POST /seed` 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-1d1e6c0c5586ccda", "name": "Unused endpoint: POST /migrate-columns", "shortDescription": {"text": "Unused endpoint: POST /migrate-columns"}, "fullDescription": {"text": "`app/api/crm_setup.py` declares `POST /migrate-columns` 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-f21ea52af4555800", "name": "Unused endpoint: GET /track/open/{tracking_id}.png", "shortDescription": {"text": "Unused endpoint: GET /track/open/{tracking_id}.png"}, "fullDescription": {"text": "`app/api/tracking.py` declares `GET /track/open/{tracking_id}.png` 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-110b9360c9c8b077", "name": "Unused endpoint: GET /track/click/{tracking_id}", "shortDescription": {"text": "Unused endpoint: GET /track/click/{tracking_id}"}, "fullDescription": {"text": "`app/api/tracking.py` declares `GET /track/click/{tracking_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-5c58c40b0188b526", "name": "Unused endpoint: GET /unsubscribe/{token}", "shortDescription": {"text": "Unused endpoint: GET /unsubscribe/{token}"}, "fullDescription": {"text": "`app/api/tracking.py` declares `GET /unsubscribe/{token}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1bee31f9bbe0b79d", "name": "Unused endpoint: POST /unsubscribe/{token}/confirm", "shortDescription": {"text": "Unused endpoint: POST /unsubscribe/{token}/confirm"}, "fullDescription": {"text": "`app/api/tracking.py` declares `POST /unsubscribe/{token}/confirm` 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-65f9a5b72d6f1f14", "name": "Unused endpoint: POST /analytics/pageview", "shortDescription": {"text": "Unused endpoint: POST /analytics/pageview"}, "fullDescription": {"text": "`app/api/analytics.py` declares `POST /analytics/pageview` 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-fb2b43337ad35e1b", "name": "Unused endpoint: POST /analytics/click", "shortDescription": {"text": "Unused endpoint: POST /analytics/click"}, "fullDescription": {"text": "`app/api/analytics.py` declares `POST /analytics/click` 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-8a26e14cbc48faa7", "name": "Unused endpoint: POST /analytics/scroll", "shortDescription": {"text": "Unused endpoint: POST /analytics/scroll"}, "fullDescription": {"text": "`app/api/analytics.py` declares `POST /analytics/scroll` 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-96f6e741a4d1c45a", "name": "Unused endpoint: GET /api/analytics/overview", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/overview"}, "fullDescription": {"text": "`app/api/analytics.py` declares `GET /api/analytics/overview` 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-f0f2873993c18f13", "name": "Unused endpoint: GET /api/analytics/timeline", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/timeline"}, "fullDescription": {"text": "`app/api/analytics.py` declares `GET /api/analytics/timeline` 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-c10289f904f1a15b", "name": "Unused endpoint: GET /api/analytics/scroll-dropoff", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/scroll-dropoff"}, "fullDescription": {"text": "`app/api/analytics.py` declares `GET /api/analytics/scroll-dropoff` 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-8d274691c7f2721a", "name": "Unused endpoint: GET /by-customer", "shortDescription": {"text": "Unused endpoint: GET /by-customer"}, "fullDescription": {"text": "`app/api/projects.py` declares `GET /by-customer` 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-106f3e7fc5f65e4f", "name": "Unused endpoint: GET /{project_id}", "shortDescription": {"text": "Unused endpoint: GET /{project_id}"}, "fullDescription": {"text": "`app/api/projects.py` declares `GET /{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-848b89c1b37f66cf", "name": "Unused endpoint: PUT /{project_id}", "shortDescription": {"text": "Unused endpoint: PUT /{project_id}"}, "fullDescription": {"text": "`app/api/projects.py` declares `PUT /{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-b9174fa868399f10", "name": "Unused endpoint: DELETE /{project_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{project_id}"}, "fullDescription": {"text": "`app/api/projects.py` declares `DELETE /{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-d345fa90f5de3745", "name": "Unused endpoint: GET /authorize", "shortDescription": {"text": "Unused endpoint: GET /authorize"}, "fullDescription": {"text": "`app/api/webex.py` declares `GET /authorize` 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-cdfb578618cf2542", "name": "Unused endpoint: GET /callback", "shortDescription": {"text": "Unused endpoint: GET /callback"}, "fullDescription": {"text": "`app/api/webex.py` declares `GET /callback` 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-236d254a125da481", "name": "Unused endpoint: GET /token", "shortDescription": {"text": "Unused endpoint: GET /token"}, "fullDescription": {"text": "`app/api/webex.py` declares `GET /token` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-612648bbd62b68ab", "name": "Unused endpoint: DELETE /disconnect", "shortDescription": {"text": "Unused endpoint: DELETE /disconnect"}, "fullDescription": {"text": "`app/api/webex.py` declares `DELETE /disconnect` 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-540ebf4772ccf420", "name": "Unused endpoint: POST /disconnect", "shortDescription": {"text": "Unused endpoint: POST /disconnect"}, "fullDescription": {"text": "`app/api/webex.py` declares `POST /disconnect` 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-cccfe89f81ab208f", "name": "Unused endpoint: POST /preview", "shortDescription": {"text": "Unused endpoint: POST /preview"}, "fullDescription": {"text": "`app/api/leads.py` declares `POST /preview` 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-aae8a7f6e5174599", "name": "Unused endpoint: POST /import-mapped", "shortDescription": {"text": "Unused endpoint: POST /import-mapped"}, "fullDescription": {"text": "`app/api/leads.py` declares `POST /import-mapped` 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-be4cb5e3cabcce80", "name": "Unused endpoint: POST /import", "shortDescription": {"text": "Unused endpoint: POST /import"}, "fullDescription": {"text": "`app/api/leads.py` declares `POST /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-435f11cb90fdd400", "name": "Unused endpoint: POST /enrich", "shortDescription": {"text": "Unused endpoint: POST /enrich"}, "fullDescription": {"text": "`app/api/leads.py` declares `POST /enrich` 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-7b542899f7d5b7cf", "name": "Unused endpoint: GET /{lead_id}", "shortDescription": {"text": "Unused endpoint: GET /{lead_id}"}, "fullDescription": {"text": "`app/api/leads.py` declares `GET /{lead_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-a3b7be566836532e", "name": "Unused endpoint: GET /{lead_id}/emails", "shortDescription": {"text": "Unused endpoint: GET /{lead_id}/emails"}, "fullDescription": {"text": "`app/api/leads.py` declares `GET /{lead_id}/emails` 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-e0bb266d8ddabb98", "name": "Unused endpoint: PUT /{lead_id}/personalization", "shortDescription": {"text": "Unused endpoint: PUT /{lead_id}/personalization"}, "fullDescription": {"text": "`app/api/leads.py` declares `PUT /{lead_id}/personalization` 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-3b30f4c0994a30b4", "name": "Unused endpoint: DELETE /", "shortDescription": {"text": "Unused endpoint: DELETE /"}, "fullDescription": {"text": "`app/api/leads.py` declares `DELETE /` 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-68b3008dcf240037", "name": "Unused endpoint: DELETE /{lead_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{lead_id}"}, "fullDescription": {"text": "`app/api/leads.py` declares `DELETE /{lead_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-e1b7bee247ffc801", "name": "Unused endpoint: GET /summary", "shortDescription": {"text": "Unused endpoint: GET /summary"}, "fullDescription": {"text": "`app/api/costs.py` declares `GET /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-7e2cd3d05d94888a", "name": "Unused endpoint: GET /sent", "shortDescription": {"text": "Unused endpoint: GET /sent"}, "fullDescription": {"text": "`app/api/sent_emails.py` declares `GET /sent` 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-470082cf718c6af5", "name": "Unused endpoint: GET /sent/{lead_id}/timeline", "shortDescription": {"text": "Unused endpoint: GET /sent/{lead_id}/timeline"}, "fullDescription": {"text": "`app/api/sent_emails.py` declares `GET /sent/{lead_id}/timeline` 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-833166601f18ed4b", "name": "Unused endpoint: GET /sent/campaigns", "shortDescription": {"text": "Unused endpoint: GET /sent/campaigns"}, "fullDescription": {"text": "`app/api/sent_emails.py` declares `GET /sent/campaigns` 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-ac2f552bf9d967ce", "name": "Unused endpoint: GET /overview", "shortDescription": {"text": "Unused endpoint: GET /overview"}, "fullDescription": {"text": "`app/api/dashboard.py` declares `GET /overview` 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-bf8708f93c5621bc", "name": "Unused endpoint: GET /timeline", "shortDescription": {"text": "Unused endpoint: GET /timeline"}, "fullDescription": {"text": "`app/api/dashboard.py` declares `GET /timeline` 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-43ea6878bfcf0f12", "name": "Unused endpoint: GET /ab-tests", "shortDescription": {"text": "Unused endpoint: GET /ab-tests"}, "fullDescription": {"text": "`app/api/dashboard.py` declares `GET /ab-tests` 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-0701f1a61a779432", "name": "Unused endpoint: GET /sending-accounts", "shortDescription": {"text": "Unused endpoint: GET /sending-accounts"}, "fullDescription": {"text": "`app/api/dashboard.py` declares `GET /sending-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-de0fbb72ab9b7cec", "name": "Unused endpoint: GET /campaign-comparison", "shortDescription": {"text": "Unused endpoint: GET /campaign-comparison"}, "fullDescription": {"text": "`app/api/dashboard.py` declares `GET /campaign-comparison` 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-0e5f346161dec29c", "name": "Unused endpoint: GET /analytics/script.js", "shortDescription": {"text": "Unused endpoint: GET /analytics/script.js"}, "fullDescription": {"text": "`app/api/tracking_script.py` declares `GET /analytics/script.js` 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/24072"}, "properties": {"repository": "Alexis-beep-debug/email-outreach-dynvon", "repoUrl": "https://github.com/Alexis-beep-debug/email-outreach-dynvon", "branch": "main"}, "results": [{"ruleId": "scanner-602e181a67cf7aab", "level": "note", "message": {"text": "Possibly dead Python function: progress"}, "properties": {"repobilityId": "97c07eb024e59ee8", "scanner": "scanner-primary", "fingerprint": "602e181a67cf7aab", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "local_scraper.py:216"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dd5a1f7d7b392d14", "level": "note", "message": {"text": "Possibly dead Python function: progress_cb"}, "properties": {"repobilityId": "0bcda563538102e0", "scanner": "scanner-primary", "fingerprint": "dd5a1f7d7b392d14", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "worker.py:191"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4cad628223f3cf1b", "level": "note", "message": {"text": "Possibly dead Python function: progress"}, "properties": {"repobilityId": "97c07eb024e59ee8", "scanner": "scanner-primary", "fingerprint": "4cad628223f3cf1b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lead_scraper/cli.py:90"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-81a1eac7fc6f1aa2", "level": "note", "message": {"text": "Possibly dead Python function: verify_email_smtp"}, "properties": {"repobilityId": "2ce3b59522ac6304", "scanner": "scanner-primary", "fingerprint": "81a1eac7fc6f1aa2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lead_scraper/extractors/email_finder.py:41"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f03ebe3e5dfb3646", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "f03ebe3e5dfb3646", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/infrastructure/retry_config.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-163b9ba24b699b6c", "level": "note", "message": {"text": "Possibly dead Python function: add_request_id"}, "properties": {"repobilityId": "dd9910ee23ecb7e9", "scanner": "scanner-primary", "fingerprint": "163b9ba24b699b6c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/infrastructure/logging_config.py:18"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c204b39b4b09c824", "level": "note", "message": {"text": "Possibly dead Python function: replace_link"}, "properties": {"repobilityId": "93543400bda676ca", "scanner": "scanner-primary", "fingerprint": "c204b39b4b09c824", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/tracking/tracker.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-acc58cd512d43886", "level": "note", "message": {"text": "Possibly dead Python function: require_admin"}, "properties": {"repobilityId": "3c06db2e25566bf7", "scanner": "scanner-primary", "fingerprint": "acc58cd512d43886", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/core/auth_utils.py:124"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-06d587023b64589f", "level": "note", "message": {"text": "Possibly dead Python function: search_by_address"}, "properties": {"repobilityId": "e754fa3b446b877d", "scanner": "scanner-primary", "fingerprint": "06d587023b64589f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/imap_service.py:158"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b83a13d023e4572e", "level": "note", "message": {"text": "Possibly dead Python function: check_batch"}, "properties": {"repobilityId": "8247a7b656e3d9cc", "scanner": "scanner-primary", "fingerprint": "b83a13d023e4572e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/duplicate_detector.py:239"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-843f625d8d3abb27", "level": "note", "message": {"text": "Possibly dead Python function: create_contact"}, "properties": {"repobilityId": "e7bdfc1046d94b2a", "scanner": "scanner-primary", "fingerprint": "843f625d8d3abb27", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/close_crm.py:81"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-68d04b49c7831ad8", "level": "note", "message": {"text": "Possibly dead Python function: update_lead_status"}, "properties": {"repobilityId": "5173d384dab7ac81", "scanner": "scanner-primary", "fingerprint": "68d04b49c7831ad8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/close_crm.py:129"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-42535e8fb9a1f25f", "level": "note", "message": {"text": "Possibly dead Python function: search_contacts_by_email"}, "properties": {"repobilityId": "a187f85cf43a82ab", "scanner": "scanner-primary", "fingerprint": "42535e8fb9a1f25f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/close_crm.py:143"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-909d160da3747f8e", "level": "note", "message": {"text": "Possibly dead Python function: sync_reply_to_close"}, "properties": {"repobilityId": "675857148a659505", "scanner": "scanner-primary", "fingerprint": "909d160da3747f8e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/close_crm.py:350"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a7572d700315023d", "level": "note", "message": {"text": "Possibly dead Python function: sync_open_to_close"}, "properties": {"repobilityId": "7124671dfe088d6f", "scanner": "scanner-primary", "fingerprint": "a7572d700315023d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/close_crm.py:365"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d9467115faf65f37", "level": "note", "message": {"text": "Possibly dead Python function: sync_click_to_close"}, "properties": {"repobilityId": "dd0b48ac89fbadc9", "scanner": "scanner-primary", "fingerprint": "d9467115faf65f37", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/close_crm.py:382"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-87d2a25cee3c39a7", "level": "note", "message": {"text": "Possibly dead Python function: sync_bounce_to_close"}, "properties": {"repobilityId": "c7cf43f221424fa5", "scanner": "scanner-primary", "fingerprint": "87d2a25cee3c39a7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/close_crm.py:399"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5981691054706077", "level": "note", "message": {"text": "Possibly dead Python function: sync_meeting_to_close"}, "properties": {"repobilityId": "aaaf19540a16a660", "scanner": "scanner-primary", "fingerprint": "5981691054706077", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/close_crm.py:413"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-382fef93c5405e16", "level": "note", "message": {"text": "Possibly dead Python function: replace_var"}, "properties": {"repobilityId": "6ddd6a0618c8f87c", "scanner": "scanner-primary", "fingerprint": "382fef93c5405e16", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/template_engine.py:38"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-950ff173076b3616", "level": "note", "message": {"text": "Possibly dead Python function: enrich_leads_csv"}, "properties": {"repobilityId": "50180106ac67aedf", "scanner": "scanner-primary", "fingerprint": "950ff173076b3616", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/lead_enrichment.py:145"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9dee3d85c981c0ae", "level": "note", "message": {"text": "Possibly dead Python function: initiate_call"}, "properties": {"repobilityId": "f0fa86425c0c9084", "scanner": "scanner-primary", "fingerprint": "9dee3d85c981c0ae", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/placetel.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-059adb0eba3f1c8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/App.jsx:395"}, "properties": {"repobilityId": "111647523ac97efe", "scanner": "scanner-primary", "fingerprint": "059adb0eba3f1c8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-299fc193576b48b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 dashboard/src/hooks/useWebexCalling.js:40"}, "properties": {"repobilityId": "3be00069db34136d", "scanner": "scanner-primary", "fingerprint": "299fc193576b48b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c040fd3cf60d2ffd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/DashboardPage.jsx:69"}, "properties": {"repobilityId": "4a256baf07629500", "scanner": "scanner-primary", "fingerprint": "c040fd3cf60d2ffd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-657c623b8eb616e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/EmailThread.jsx:33"}, "properties": {"repobilityId": "be6653511677a9a9", "scanner": "scanner-primary", "fingerprint": "657c623b8eb616e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c6e3fc54014485e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/components/EmailThread.jsx:54"}, "properties": {"repobilityId": "c897a84e44147561", "scanner": "scanner-primary", "fingerprint": "9c6e3fc54014485e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2976bbc812ca63a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/CallHandler.jsx:38"}, "properties": {"repobilityId": "ebc3552f00fe0226", "scanner": "scanner-primary", "fingerprint": "2976bbc812ca63a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24cd3cfd9a00f187", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/AddCardModal.jsx:139"}, "properties": {"repobilityId": "ae9b96c8454a5c80", "scanner": "scanner-primary", "fingerprint": "24cd3cfd9a00f187", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-28c4d751756cebd6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/components/EmailComposer.jsx:230"}, "properties": {"repobilityId": "9881dfdc73e72a95", "scanner": "scanner-primary", "fingerprint": "28c4d751756cebd6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-763e8fb7a5927eec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/EmailsSection.jsx:102"}, "properties": {"repobilityId": "0d68611b59c51333", "scanner": "scanner-primary", "fingerprint": "763e8fb7a5927eec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-000b1c0c2ba35e0f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/components/EmailsSection.jsx:140"}, "properties": {"repobilityId": "719f56a133009034", "scanner": "scanner-primary", "fingerprint": "000b1c0c2ba35e0f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-39190c2234fb73f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/DocumentsSection.jsx:252"}, "properties": {"repobilityId": "2ae9b1cdda6a258a", "scanner": "scanner-primary", "fingerprint": "39190c2234fb73f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21ace4c8fcd7f2bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/components/StatCard.jsx:23"}, "properties": {"repobilityId": "553820718213d027", "scanner": "scanner-primary", "fingerprint": "21ace4c8fcd7f2bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4682e9dd22eb876c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/SentEmails.jsx:86"}, "properties": {"repobilityId": "b045934f91116b9f", "scanner": "scanner-primary", "fingerprint": "4682e9dd22eb876c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-82fe3336e01868b6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/SentEmails.jsx:104"}, "properties": {"repobilityId": "c00c7d477f22c822", "scanner": "scanner-primary", "fingerprint": "82fe3336e01868b6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2e8007bb074309ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/LeadScraper.jsx:415"}, "properties": {"repobilityId": "79ae5ca6ce88c639", "scanner": "scanner-primary", "fingerprint": "2e8007bb074309ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a65a0f6cb3dcb26", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CampaignDetail.jsx:176"}, "properties": {"repobilityId": "880bacea769ff313", "scanner": "scanner-primary", "fingerprint": "7a65a0f6cb3dcb26", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-93b8ca883df2cf55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CRMPipeline.jsx:53"}, "properties": {"repobilityId": "c257509f357a62f3", "scanner": "scanner-primary", "fingerprint": "93b8ca883df2cf55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c5d729f36e890c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Overview.jsx:267"}, "properties": {"repobilityId": "f0fb8edb00507f50", "scanner": "scanner-primary", "fingerprint": "9c5d729f36e890c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a93645a4f5d23f66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/DialerPage.jsx:257"}, "properties": {"repobilityId": "abe5e36e07a73e19", "scanner": "scanner-primary", "fingerprint": "a93645a4f5d23f66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e47ea79a9a9ec0c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/KontaktDetail.jsx:160"}, "properties": {"repobilityId": "89ead5735d6785a6", "scanner": "scanner-primary", "fingerprint": "1e47ea79a9a9ec0c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de5f8f89e75f95ab", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/KontaktDetail.jsx:1097"}, "properties": {"repobilityId": "64103cbea791ac5f", "scanner": "scanner-primary", "fingerprint": "de5f8f89e75f95ab", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-90886971b2444ee5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CampaignCreate.jsx:225"}, "properties": {"repobilityId": "18a2af3705ea62c3", "scanner": "scanner-primary", "fingerprint": "90886971b2444ee5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f1160574bb3c60d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CampaignCreate.jsx:368"}, "properties": {"repobilityId": "8f08941f88f51a6f", "scanner": "scanner-primary", "fingerprint": "8f1160574bb3c60d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0e912af2e9c3fce8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Aufgaben.jsx:272"}, "properties": {"repobilityId": "4b46b66c8eb4210e", "scanner": "scanner-primary", "fingerprint": "0e912af2e9c3fce8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2ba7bb28aa0dea94", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/Aufgaben.jsx:282"}, "properties": {"repobilityId": "82995c1464a9f956", "scanner": "scanner-primary", "fingerprint": "2ba7bb28aa0dea94", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e1e532387b39fdb0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CRMSettings.jsx:892"}, "properties": {"repobilityId": "7e66057acdb725f7", "scanner": "scanner-primary", "fingerprint": "e1e532387b39fdb0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ded8c10c6336f5c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CRMSettings.jsx:610"}, "properties": {"repobilityId": "09d507ad2f2766a1", "scanner": "scanner-primary", "fingerprint": "5ded8c10c6336f5c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-237e667bf4564d9c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/DealDetail.jsx:201"}, "properties": {"repobilityId": "9840cc470abbab29", "scanner": "scanner-primary", "fingerprint": "237e667bf4564d9c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-877ab4c4a54b1bd0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/DealDetail.jsx:1526"}, "properties": {"repobilityId": "67bd4f795bd0f9e6", "scanner": "scanner-primary", "fingerprint": "877ab4c4a54b1bd0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4a20109920ebb15c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/LeadsUnified.jsx:782"}, "properties": {"repobilityId": "3adaa0bba9bf7bae", "scanner": "scanner-primary", "fingerprint": "4a20109920ebb15c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-349e21045e444b3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/CRMInbox.jsx:299"}, "properties": {"repobilityId": "e9efe896b57fd68b", "scanner": "scanner-primary", "fingerprint": "349e21045e444b3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f05480e55d78fc5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/CRMInbox.jsx:444"}, "properties": {"repobilityId": "aa037888f9beabad", "scanner": "scanner-primary", "fingerprint": "8f05480e55d78fc5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f3778e710335ce85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Organisationen.jsx:273"}, "properties": {"repobilityId": "590bf34f16c1e492", "scanner": "scanner-primary", "fingerprint": "f3778e710335ce85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f74521af325ed413", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Projekte.jsx:482"}, "properties": {"repobilityId": "c64b29b121ff11d5", "scanner": "scanner-primary", "fingerprint": "f74521af325ed413", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0eb60cf6d819d54f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/KundenDetail.jsx:173"}, "properties": {"repobilityId": "1c3100b88eaa2d52", "scanner": "scanner-primary", "fingerprint": "0eb60cf6d819d54f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-125a21208e6749c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Leads.jsx:279"}, "properties": {"repobilityId": "2ba73399c7dd9c9a", "scanner": "scanner-primary", "fingerprint": "125a21208e6749c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59268ddea2180de8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Kalender.jsx:110"}, "properties": {"repobilityId": "d1f3a8b6d3a82512", "scanner": "scanner-primary", "fingerprint": "59268ddea2180de8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-565e3cc7d17aa420", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/OrganisationDetail.jsx:250"}, "properties": {"repobilityId": "f969b2cedf1fbef5", "scanner": "scanner-primary", "fingerprint": "565e3cc7d17aa420", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-100246231f7a9b60", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 dashboard/src/pages/OrganisationDetail.jsx:395"}, "properties": {"repobilityId": "a3b666b1c23b2b3e", "scanner": "scanner-primary", "fingerprint": "100246231f7a9b60", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d7d72d5b1a3cae15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Kunden.jsx:50"}, "properties": {"repobilityId": "fdabbf9986442e8e", "scanner": "scanner-primary", "fingerprint": "d7d72d5b1a3cae15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eae71755c484b91f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/Finanzen.jsx:311"}, "properties": {"repobilityId": "3ae09d92a9c0b648", "scanner": "scanner-primary", "fingerprint": "eae71755c484b91f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-661c8d9a74e72032", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 dashboard/src/pages/WebAnalytics.jsx:103"}, "properties": {"repobilityId": "1c5f2f198fb21587", "scanner": "scanner-primary", "fingerprint": "661c8d9a74e72032", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-556d07aa56dc4d81", "level": "warning", "message": {"text": "Privileged port 465 in use"}, "properties": {"repobilityId": "bcd1f06b60a2b6bc", "scanner": "scanner-primary", "fingerprint": "556d07aa56dc4d81", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/replies.py"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-440b41e3eac85abb", "level": "warning", "message": {"text": "Privileged port 993 in use"}, "properties": {"repobilityId": "a36e56a26353e9ee", "scanner": "scanner-primary", "fingerprint": "440b41e3eac85abb", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/services/imap_service.py"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-8987d6d1c30c7202", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "068fbf45727eac17", "scanner": "scanner-primary", "fingerprint": "8987d6d1c30c7202", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-de3c1f217d72a063", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "065bf97e0cc26aa1", "scanner": "scanner-primary", "fingerprint": "de3c1f217d72a063", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-8ddae01d7cd3ffa9", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in agents/website_fetcher.py:55"}, "properties": {"repobilityId": "d9d07f89a0e555dc", "scanner": "scanner-primary", "fingerprint": "8ddae01d7cd3ffa9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "agents/website_fetcher.py"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-4416ffe15126b675", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/components/EmailThread.jsx:54"}, "properties": {"repobilityId": "4a4dd5da1cdb7091", "scanner": "scanner-primary", "fingerprint": "4416ffe15126b675", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/components/EmailThread.jsx"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-65f9a5098d788550", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/components/EmailComposer.jsx:230"}, "properties": {"repobilityId": "671a232e1a71e6f5", "scanner": "scanner-primary", "fingerprint": "65f9a5098d788550", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/components/EmailComposer.jsx"}, "region": {"startLine": 230}}}]}, {"ruleId": "scanner-9c66197489c8fe2e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/components/EmailsSection.jsx:140"}, "properties": {"repobilityId": "060ff037987345fd", "scanner": "scanner-primary", "fingerprint": "9c66197489c8fe2e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/components/EmailsSection.jsx"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-319c285ea5ff64ea", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/SentEmails.jsx:104"}, "properties": {"repobilityId": "d3a419ce79a8e778", "scanner": "scanner-primary", "fingerprint": "319c285ea5ff64ea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/pages/SentEmails.jsx"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-4d2958dd08647365", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CampaignDetail.jsx:176"}, "properties": {"repobilityId": "9b1bb98f199ee111", "scanner": "scanner-primary", "fingerprint": "4d2958dd08647365", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/pages/CampaignDetail.jsx"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-d11868770f0bc378", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/KontaktDetail.jsx:1097"}, "properties": {"repobilityId": "bf5efb417dc1bd56", "scanner": "scanner-primary", "fingerprint": "d11868770f0bc378", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/pages/KontaktDetail.jsx"}, "region": {"startLine": 1097}}}]}, {"ruleId": "scanner-6a464f1fb7087837", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CampaignCreate.jsx:368"}, "properties": {"repobilityId": "09768022e2c0a508", "scanner": "scanner-primary", "fingerprint": "6a464f1fb7087837", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/pages/CampaignCreate.jsx"}, "region": {"startLine": 368}}}]}, {"ruleId": "scanner-6b755f39120301e4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/Aufgaben.jsx:282"}, "properties": {"repobilityId": "d5d5b1b5cbbdec29", "scanner": "scanner-primary", "fingerprint": "6b755f39120301e4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/pages/Aufgaben.jsx"}, "region": {"startLine": 282}}}]}, {"ruleId": "scanner-44292ab05d5ae555", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CRMSettings.jsx:610"}, "properties": {"repobilityId": "516df82f7e6eb75e", "scanner": "scanner-primary", "fingerprint": "44292ab05d5ae555", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/pages/CRMSettings.jsx"}, "region": {"startLine": 610}}}]}, {"ruleId": "scanner-40a0d35d81d59387", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/DealDetail.jsx:1526"}, "properties": {"repobilityId": "4cc385f648ee92e9", "scanner": "scanner-primary", "fingerprint": "40a0d35d81d59387", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/pages/DealDetail.jsx"}, "region": {"startLine": 1526}}}]}, {"ruleId": "scanner-05dd2fcb2e619c76", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/CRMInbox.jsx:444"}, "properties": {"repobilityId": "1ae406b9f3dc51de", "scanner": "scanner-primary", "fingerprint": "05dd2fcb2e619c76", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/pages/CRMInbox.jsx"}, "region": {"startLine": 444}}}]}, {"ruleId": "scanner-6d73ad6c0741c2f0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in dashboard/src/pages/OrganisationDetail.jsx:395"}, "properties": {"repobilityId": "7fb2ac0fd207774c", "scanner": "scanner-primary", "fingerprint": "6d73ad6c0741c2f0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard/src/pages/OrganisationDetail.jsx"}, "region": {"startLine": 395}}}]}, {"ruleId": "scanner-f2e545d8632a0a19", "level": "note", "message": {"text": "Very large file: dashboard/src/pages/KontaktDetail.jsx (1935 lines)"}, "properties": {"repobilityId": "0a77018824c47aee", "scanner": "scanner-primary", "fingerprint": "f2e545d8632a0a19", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-01ae35581baae1c5", "level": "note", "message": {"text": "Very large file: dashboard/src/pages/CRMSettings.jsx (2062 lines)"}, "properties": {"repobilityId": "b6f8590619439bfc", "scanner": "scanner-primary", "fingerprint": "01ae35581baae1c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cd6497198066d7e5", "level": "note", "message": {"text": "Very large file: dashboard/src/pages/DealDetail.jsx (1983 lines)"}, "properties": {"repobilityId": "5c44adc1bbcc1f4d", "scanner": "scanner-primary", "fingerprint": "cd6497198066d7e5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cd125d7f76c93cdf", "level": "note", "message": {"text": "Very large file: dashboard/src/pages/LeadsUnified.jsx (1282 lines)"}, "properties": {"repobilityId": "a19ca3d642205aa3", "scanner": "scanner-primary", "fingerprint": "cd125d7f76c93cdf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7858bfead9526fee", "level": "note", "message": {"text": "Very large file: app/api/test_email.py (2127 lines)"}, "properties": {"repobilityId": "832d63cdb2a74403", "scanner": "scanner-primary", "fingerprint": "7858bfead9526fee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "cf5d06db0f8212c2", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "eefcfa30d2d53689", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "9d3d821fee678fca", "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": "5c86f0c613016e21", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "b40ac51920c4b3af", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "a93a13f11fe2fb7f", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-be83ecad498b0402", "level": "note", "message": {"text": "Legacy-named symbol `cache_sample_1000_v2` in run_score_1000_v2.py:15"}, "properties": {"repobilityId": "3e1776b85bfd1f5d", "scanner": "scanner-primary", "fingerprint": "be83ecad498b0402", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0e049ed5633bc628", "level": "note", "message": {"text": "Legacy-named symbol `lead_pipeline_v2` in agents/lead_pipeline_v2.py:14"}, "properties": {"repobilityId": "eb67cc92ec830a30", "scanner": "scanner-primary", "fingerprint": "0e049ed5633bc628", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d3a34d97c47c3cf7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/App.jsx:182"}, "properties": {"repobilityId": "80a5eec812542e7b", "scanner": "scanner-primary", "fingerprint": "d3a34d97c47c3cf7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e2216cb73693e1d2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/utils/api.js:147"}, "properties": {"repobilityId": "896ac629d5bdd700", "scanner": "scanner-primary", "fingerprint": "e2216cb73693e1d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a1f7b8642dc4c1bf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/components/DashboardPage.jsx:213"}, "properties": {"repobilityId": "e390f0e0b37b1c9b", "scanner": "scanner-primary", "fingerprint": "a1f7b8642dc4c1bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-84ed5a405db226af", "level": "none", "message": {"text": "Commented-code block (5 lines) in dashboard/src/components/CallHandler.jsx:70"}, "properties": {"repobilityId": "168e1d82024f49d2", "scanner": "scanner-primary", "fingerprint": "84ed5a405db226af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-edc5fa555bff4bff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/pages/CloseCRM.jsx:7"}, "properties": {"repobilityId": "fa4e3af3996d40c9", "scanner": "scanner-primary", "fingerprint": "edc5fa555bff4bff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7cfc346c2e1ef28c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 dashboard/src/pages/WebAnalytics.jsx:12"}, "properties": {"repobilityId": "41255a65eacafaa5", "scanner": "scanner-primary", "fingerprint": "7cfc346c2e1ef28c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-77da9400ed12ff33", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/main.py:54"}, "properties": {"repobilityId": "e073d43b785dc02e", "scanner": "scanner-primary", "fingerprint": "77da9400ed12ff33", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ea146e7276a3f63", "level": "note", "message": {"text": "Legacy-named symbol `lead_pipeline_v2` in app/api/scraper.py:127"}, "properties": {"repobilityId": "801c0fedd3caa2d7", "scanner": "scanner-primary", "fingerprint": "4ea146e7276a3f63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-18120a6430ec5f44", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/branche_backfill.py:51"}, "properties": {"repobilityId": "add28548dcc4648e", "scanner": "scanner-primary", "fingerprint": "18120a6430ec5f44", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65df07ab4020db79", "level": "note", "message": {"text": "18 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5e334d56f52c02e1", "scanner": "scanner-primary", "fingerprint": "65df07ab4020db79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a2c1578f712911e3", "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": "d53dd2351d3045af", "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": "aee97e6fe3449965", "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": "0e0a0eedfbcb3b58", "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": "2e615db50c5fd042", "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": "62d711d6d49db56a", "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": "b8becb4382e04889", "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": "d8a1f124c13c509d", "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": "f62ba6abdbdee98d", "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": "975a2365fda0cf03", "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": "8931765e41c09130", "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": "cd430a4cf59bef37", "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": "cbc431713d8ab4f3", "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": "a1322aa11908f405", "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": "22268f7d76cd06a3", "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": "e3fd42e26f5ad9d8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-64545ea3a3de45cd", "level": "warning", "message": {"text": "Frontend route `/kunden/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "cfffc1b75429d535", "scanner": "scanner-primary", "fingerprint": "64545ea3a3de45cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2be9a37c6356cba3", "level": "warning", "message": {"text": "Frontend route `/crm/organisationen/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "48fc348244e5d9f9", "scanner": "scanner-primary", "fingerprint": "2be9a37c6356cba3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b63ca8b264028cef", "level": "warning", "message": {"text": "Frontend route `/crm/kontakte/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "2f36411101b427a8", "scanner": "scanner-primary", "fingerprint": "b63ca8b264028cef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f86d209f008bf765", "level": "warning", "message": {"text": "Frontend route `/crm/deals/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "c8270e1e4aa21bb0", "scanner": "scanner-primary", "fingerprint": "f86d209f008bf765", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7da7fbc186accf03", "level": "warning", "message": {"text": "Frontend route `/crm/rechnungen` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "0d7be1990991db79", "scanner": "scanner-primary", "fingerprint": "7da7fbc186accf03", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5c9307469b63aed3", "level": "warning", "message": {"text": "Frontend route `/antworten` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "5d3a843791fdc121", "scanner": "scanner-primary", "fingerprint": "5c9307469b63aed3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8cb0406b7de20bfe", "level": "warning", "message": {"text": "Frontend route `/campaigns/:id` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "1f5ff3c535dc489b", "scanner": "scanner-primary", "fingerprint": "8cb0406b7de20bfe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d374034efa6c08b6", "level": "warning", "message": {"text": "Frontend route `/leads` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "873cffb9bb7b853a", "scanner": "scanner-primary", "fingerprint": "d374034efa6c08b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b3b2656a7ad01e0c", "level": "warning", "message": {"text": "Frontend route `/accounts` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "d75a14155c203805", "scanner": "scanner-primary", "fingerprint": "b3b2656a7ad01e0c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5d525d1821cb56d2", "level": "warning", "message": {"text": "Frontend route `/close` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "915cc994c4ea0bd7", "scanner": "scanner-primary", "fingerprint": "5d525d1821cb56d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c34478cb62369a8a", "level": "warning", "message": {"text": "Frontend route `/scraper` has no Link/navigate to it \u2014 dashboard/src/App.jsx"}, "properties": {"repobilityId": "d8350881c29eaf11", "scanner": "scanner-primary", "fingerprint": "c34478cb62369a8a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b28f517a2cb514bb", "level": "error", "message": {"text": "FastAPI POST `migrate_columns` without auth dependency \u2014 app/api/crm_setup.py:329"}, "properties": {"repobilityId": "dd090d131fe731c3", "scanner": "scanner-primary", "fingerprint": "b28f517a2cb514bb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/crm_setup.py"}, "region": {"startLine": 329}}}]}, {"ruleId": "scanner-b0e03dc900b0f72e", "level": "error", "message": {"text": "FastAPI POST `confirm_unsubscribe` without auth dependency \u2014 app/api/tracking.py:106"}, "properties": {"repobilityId": "73b4cf1631e391de", "scanner": "scanner-primary", "fingerprint": "b0e03dc900b0f72e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/tracking.py"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-ec7a39f9f2008670", "level": "error", "message": {"text": "FastAPI POST `track_pageview` without auth dependency \u2014 app/api/analytics.py:88"}, "properties": {"repobilityId": "c23cbffcddec109e", "scanner": "scanner-primary", "fingerprint": "ec7a39f9f2008670", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/analytics.py"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-644ca68f38f6df33", "level": "error", "message": {"text": "FastAPI POST `track_click` without auth dependency \u2014 app/api/analytics.py:120"}, "properties": {"repobilityId": "00b2bb6f6022bb32", "scanner": "scanner-primary", "fingerprint": "644ca68f38f6df33", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/analytics.py"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-376867e43dba71a6", "level": "error", "message": {"text": "FastAPI POST `track_scroll` without auth dependency \u2014 app/api/analytics.py:147"}, "properties": {"repobilityId": "db855cf9941db6e6", "scanner": "scanner-primary", "fingerprint": "376867e43dba71a6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/analytics.py"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-d6c99849e93a6ce0", "level": "error", "message": {"text": "FastAPI POST `preview_csv` without auth dependency \u2014 app/api/leads.py:65"}, "properties": {"repobilityId": "c0c5cf2da4c2920e", "scanner": "scanner-primary", "fingerprint": "d6c99849e93a6ce0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/leads.py"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-bc749ee8d4bedc23", "level": "error", "message": {"text": "FastAPI POST `enrich_leads_csv` without auth dependency \u2014 app/api/leads.py:441"}, "properties": {"repobilityId": "e00888d46fab1283", "scanner": "scanner-primary", "fingerprint": "bc749ee8d4bedc23", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/leads.py"}, "region": {"startLine": 441}}}]}, {"ruleId": "scanner-7acf4756d05bf813", "level": "error", "message": {"text": "FastAPI POST `import_from_close` without auth dependency \u2014 app/api/close_crm.py:37"}, "properties": {"repobilityId": "030c1aa15dc4bc45", "scanner": "scanner-primary", "fingerprint": "7acf4756d05bf813", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/close_crm.py"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-0aef0423776b987b", "level": "error", "message": {"text": "FastAPI POST `push_to_close` without auth dependency \u2014 app/api/close_crm.py:55"}, "properties": {"repobilityId": "d75385a96ebbbdc2", "scanner": "scanner-primary", "fingerprint": "0aef0423776b987b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/close_crm.py"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-8cc06c7eed3d48f4", "level": "error", "message": {"text": "FastAPI POST `sync_activities` without auth dependency \u2014 app/api/close_crm.py:72"}, "properties": {"repobilityId": "8c552dc9e8b844c4", "scanner": "scanner-primary", "fingerprint": "8cc06c7eed3d48f4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/close_crm.py"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-cf12a208c2b9a6e7", "level": "error", "message": {"text": "FastAPI POST `push_call_priority` without auth dependency \u2014 app/api/close_crm.py:136"}, "properties": {"repobilityId": "eeb479625d4e9e88", "scanner": "scanner-primary", "fingerprint": "cf12a208c2b9a6e7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/close_crm.py"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-a840c4cdb2f25a30", "level": "error", "message": {"text": "FastAPI POST `start_scraping` without auth dependency \u2014 app/api/scraper.py:56"}, "properties": {"repobilityId": "f5942574276c0c91", "scanner": "scanner-primary", "fingerprint": "a840c4cdb2f25a30", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scraper.py"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-cc527ac6b42e2a9b", "level": "error", "message": {"text": "FastAPI POST `update_job_progress` without auth dependency \u2014 app/api/scraper.py:307"}, "properties": {"repobilityId": "26837b81faa164c5", "scanner": "scanner-primary", "fingerprint": "cc527ac6b42e2a9b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scraper.py"}, "region": {"startLine": 307}}}]}, {"ruleId": "scanner-e8879a224d892611", "level": "error", "message": {"text": "FastAPI POST `complete_job` without auth dependency \u2014 app/api/scraper.py:326"}, "properties": {"repobilityId": "a6917581c359fc7e", "scanner": "scanner-primary", "fingerprint": "e8879a224d892611", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scraper.py"}, "region": {"startLine": 326}}}]}, {"ruleId": "scanner-e2cd3b3a48a38999", "level": "error", "message": {"text": "FastAPI POST `fail_job` without auth dependency \u2014 app/api/scraper.py:344"}, "properties": {"repobilityId": "cf9a5206464da87c", "scanner": "scanner-primary", "fingerprint": "e2cd3b3a48a38999", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scraper.py"}, "region": {"startLine": 344}}}]}, {"ruleId": "scanner-c1c108978bf92e94", "level": "error", "message": {"text": "FastAPI POST `upload_scraped_leads` without auth dependency \u2014 app/api/scraper.py:361"}, "properties": {"repobilityId": "d6bbddfec99624a5", "scanner": "scanner-primary", "fingerprint": "c1c108978bf92e94", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scraper.py"}, "region": {"startLine": 361}}}]}, {"ruleId": "scanner-05cb9c81aeb6c116", "level": "error", "message": {"text": "FastAPI POST `upload_results` without auth dependency \u2014 app/api/scraper.py:370"}, "properties": {"repobilityId": "5bcfd2f95c3980f9", "scanner": "scanner-primary", "fingerprint": "05cb9c81aeb6c116", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scraper.py"}, "region": {"startLine": 370}}}]}, {"ruleId": "scanner-2d0dd15d06439b5f", "level": "error", "message": {"text": "FastAPI POST `import_leads_from_job` without auth dependency \u2014 app/api/scraper.py:398"}, "properties": {"repobilityId": "f84baf39e95d4d7e", "scanner": "scanner-primary", "fingerprint": "2d0dd15d06439b5f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scraper.py"}, "region": {"startLine": 398}}}]}, {"ruleId": "scanner-2e6f54e73d3d58f8", "level": "error", "message": {"text": "FastAPI POST `personalize_leads` without auth dependency \u2014 app/api/scraper.py:510"}, "properties": {"repobilityId": "b2c849f198f18842", "scanner": "scanner-primary", "fingerprint": "2e6f54e73d3d58f8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scraper.py"}, "region": {"startLine": 510}}}]}, {"ruleId": "scanner-8a33c15fa5f5f0bf", "level": "error", "message": {"text": "FastAPI DELETE `delete_job` without auth dependency \u2014 app/api/scraper.py:553"}, "properties": {"repobilityId": "3e32a1bf71cdc3a5", "scanner": "scanner-primary", "fingerprint": "8a33c15fa5f5f0bf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scraper.py"}, "region": {"startLine": 553}}}]}, {"ruleId": "scanner-87e62b66e1d4c6b2", "level": "error", "message": {"text": "FastAPI POST `replay_dlq_entry` without auth dependency \u2014 app/api/ops.py:53"}, "properties": {"repobilityId": "646556c3186885f9", "scanner": "scanner-primary", "fingerprint": "87e62b66e1d4c6b2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/ops.py"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-6372794103c72df6", "level": "error", "message": {"text": "FastAPI POST `preview_crm_leads_csv` without auth dependency \u2014 app/api/crm/leads_unified.py:487"}, "properties": {"repobilityId": "e4c4bf0981bd0ec0", "scanner": "scanner-primary", "fingerprint": "6372794103c72df6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/crm/leads_unified.py"}, "region": {"startLine": 487}}}]}, {"ruleId": "scanner-523c7e26f1700e6b", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/check (dashboard/src/App.jsx:182)"}, "properties": {"repobilityId": "29532445070c64fa", "scanner": "scanner-primary", "fingerprint": "523c7e26f1700e6b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-faadcc7fb5c087ef", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/logout (dashboard/src/App.jsx:221)"}, "properties": {"repobilityId": "41d0718d37310f9c", "scanner": "scanner-primary", "fingerprint": "faadcc7fb5c087ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d6d2659f6851750e", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/campaigns/${id}/steps/${editingStep.stepId} (dashboard/src/pages/CampaignDetail.jsx:35)"}, "properties": {"repobilityId": "606dfb4dc55f1104", "scanner": "scanner-primary", "fingerprint": "d6d2659f6851750e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-617f0d2a0d415cdc", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/campaigns/${id}/steps/${stepId} (dashboard/src/pages/CampaignDetail.jsx:52)"}, "properties": {"repobilityId": "efd8ed9b19e65d60", "scanner": "scanner-primary", "fingerprint": "617f0d2a0d415cdc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a6ef74a23a329c39", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/campaigns/${id}/variants/${editingVariant.variantId} (dashboard/src/pages/CampaignDetail.jsx:66)"}, "properties": {"repobilityId": "4fe2bc4833d9c387", "scanner": "scanner-primary", "fingerprint": "a6ef74a23a329c39", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2a685e91490a19e1", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login (dashboard/src/pages/Login.jsx:18)"}, "properties": {"repobilityId": "dc6bc3dcc1a40ac5", "scanner": "scanner-primary", "fingerprint": "2a685e91490a19e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-933af97987a85fca", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/invite-info?token=${token} (dashboard/src/pages/Register.jsx:22)"}, "properties": {"repobilityId": "217b0016387357ca", "scanner": "scanner-primary", "fingerprint": "933af97987a85fca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8312c308f85a9156", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/register (dashboard/src/pages/Register.jsx:73)"}, "properties": {"repobilityId": "09f3bcceef6f21a6", "scanner": "scanner-primary", "fingerprint": "8312c308f85a9156", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bb9f03f72901732d", "level": "error", "message": {"text": "Dangling fetch: GET /api/analytics${path} (dashboard/src/pages/WebAnalytics.jsx:12)"}, "properties": {"repobilityId": "09266e7bfccc5d58", "scanner": "scanner-primary", "fingerprint": "bb9f03f72901732d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5bf5530d66d680a8", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard/"}, "properties": {"repobilityId": "bac54f73072a0cc0", "scanner": "scanner-primary", "fingerprint": "5bf5530d66d680a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d504b80adc9409ec", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard"}, "properties": {"repobilityId": "86e819305f2af65e", "scanner": "scanner-primary", "fingerprint": "d504b80adc9409ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-775488fce1c65fad", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard/{path:path}"}, "properties": {"repobilityId": "dddd9b7aae674a20", "scanner": "scanner-primary", "fingerprint": "775488fce1c65fad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "d8721f71fae1e2af", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d35af6caad69ba7f", "level": "note", "message": {"text": "Unused endpoint: GET /dynvon-kmu-outreach"}, "properties": {"repobilityId": "af8f9f022a90af79", "scanner": "scanner-primary", "fingerprint": "d35af6caad69ba7f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b9d5e02b2505ca9", "level": "note", "message": {"text": "Unused endpoint: POST /dynvon-kmu-outreach/create"}, "properties": {"repobilityId": "bb14ba732d5d17cb", "scanner": "scanner-primary", "fingerprint": "3b9d5e02b2505ca9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "303c28cd6aea2b7e", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cecf400c02427097", "level": "note", "message": {"text": "Unused endpoint: PATCH /{task_id}"}, "properties": {"repobilityId": "89a5ca78e5be7bba", "scanner": "scanner-primary", "fingerprint": "cecf400c02427097", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c055f3f8f83ed5f", "level": "note", "message": {"text": "Unused endpoint: DELETE /{task_id}"}, "properties": {"repobilityId": "9b159f27f012b67d", "scanner": "scanner-primary", "fingerprint": "9c055f3f8f83ed5f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2d40c422e2f65595", "level": "note", "message": {"text": "Unused endpoint: PATCH /{task_id}/move"}, "properties": {"repobilityId": "6f521365b580251e", "scanner": "scanner-primary", "fingerprint": "2d40c422e2f65595", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3c4eb974e4684dd", "level": "note", "message": {"text": "Unused endpoint: POST /seed"}, "properties": {"repobilityId": "4f05f6ff0982d248", "scanner": "scanner-primary", "fingerprint": "f3c4eb974e4684dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1d1e6c0c5586ccda", "level": "note", "message": {"text": "Unused endpoint: POST /migrate-columns"}, "properties": {"repobilityId": "11fff0ff4da58b85", "scanner": "scanner-primary", "fingerprint": "1d1e6c0c5586ccda", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f21ea52af4555800", "level": "note", "message": {"text": "Unused endpoint: GET /track/open/{tracking_id}.png"}, "properties": {"repobilityId": "4affb5ed0b703545", "scanner": "scanner-primary", "fingerprint": "f21ea52af4555800", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-110b9360c9c8b077", "level": "note", "message": {"text": "Unused endpoint: GET /track/click/{tracking_id}"}, "properties": {"repobilityId": "fe04c548beeeef52", "scanner": "scanner-primary", "fingerprint": "110b9360c9c8b077", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5c58c40b0188b526", "level": "note", "message": {"text": "Unused endpoint: GET /unsubscribe/{token}"}, "properties": {"repobilityId": "6024ab4b601e5c32", "scanner": "scanner-primary", "fingerprint": "5c58c40b0188b526", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bee31f9bbe0b79d", "level": "note", "message": {"text": "Unused endpoint: POST /unsubscribe/{token}/confirm"}, "properties": {"repobilityId": "d4577465f5a41fe2", "scanner": "scanner-primary", "fingerprint": "1bee31f9bbe0b79d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-65f9a5b72d6f1f14", "level": "note", "message": {"text": "Unused endpoint: POST /analytics/pageview"}, "properties": {"repobilityId": "af5738edcbb9ee7f", "scanner": "scanner-primary", "fingerprint": "65f9a5b72d6f1f14", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb2b43337ad35e1b", "level": "note", "message": {"text": "Unused endpoint: POST /analytics/click"}, "properties": {"repobilityId": "87d919cbff8d1689", "scanner": "scanner-primary", "fingerprint": "fb2b43337ad35e1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a26e14cbc48faa7", "level": "note", "message": {"text": "Unused endpoint: POST /analytics/scroll"}, "properties": {"repobilityId": "dd9ea43aa3ba08fc", "scanner": "scanner-primary", "fingerprint": "8a26e14cbc48faa7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-96f6e741a4d1c45a", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/overview"}, "properties": {"repobilityId": "cfc5a597b41d440c", "scanner": "scanner-primary", "fingerprint": "96f6e741a4d1c45a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f0f2873993c18f13", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/timeline"}, "properties": {"repobilityId": "4ed3ee661951621c", "scanner": "scanner-primary", "fingerprint": "f0f2873993c18f13", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c10289f904f1a15b", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/scroll-dropoff"}, "properties": {"repobilityId": "54a1958c6fb442b6", "scanner": "scanner-primary", "fingerprint": "c10289f904f1a15b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d274691c7f2721a", "level": "note", "message": {"text": "Unused endpoint: GET /by-customer"}, "properties": {"repobilityId": "dfd63e937f596189", "scanner": "scanner-primary", "fingerprint": "8d274691c7f2721a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-106f3e7fc5f65e4f", "level": "note", "message": {"text": "Unused endpoint: GET /{project_id}"}, "properties": {"repobilityId": "1a1e1f1a1139bb63", "scanner": "scanner-primary", "fingerprint": "106f3e7fc5f65e4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-848b89c1b37f66cf", "level": "note", "message": {"text": "Unused endpoint: PUT /{project_id}"}, "properties": {"repobilityId": "e4ec0304e210d512", "scanner": "scanner-primary", "fingerprint": "848b89c1b37f66cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9174fa868399f10", "level": "note", "message": {"text": "Unused endpoint: DELETE /{project_id}"}, "properties": {"repobilityId": "9a4df237f01db7cd", "scanner": "scanner-primary", "fingerprint": "b9174fa868399f10", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d345fa90f5de3745", "level": "note", "message": {"text": "Unused endpoint: GET /authorize"}, "properties": {"repobilityId": "11203fa26d2812d6", "scanner": "scanner-primary", "fingerprint": "d345fa90f5de3745", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdfb578618cf2542", "level": "note", "message": {"text": "Unused endpoint: GET /callback"}, "properties": {"repobilityId": "2d598348ba3fcb79", "scanner": "scanner-primary", "fingerprint": "cdfb578618cf2542", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-236d254a125da481", "level": "note", "message": {"text": "Unused endpoint: GET /token"}, "properties": {"repobilityId": "452ee93979308152", "scanner": "scanner-primary", "fingerprint": "236d254a125da481", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-612648bbd62b68ab", "level": "note", "message": {"text": "Unused endpoint: DELETE /disconnect"}, "properties": {"repobilityId": "338118dc529186b5", "scanner": "scanner-primary", "fingerprint": "612648bbd62b68ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-540ebf4772ccf420", "level": "note", "message": {"text": "Unused endpoint: POST /disconnect"}, "properties": {"repobilityId": "7f2236a4e5903123", "scanner": "scanner-primary", "fingerprint": "540ebf4772ccf420", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cccfe89f81ab208f", "level": "note", "message": {"text": "Unused endpoint: POST /preview"}, "properties": {"repobilityId": "48ae2abff25d28c6", "scanner": "scanner-primary", "fingerprint": "cccfe89f81ab208f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aae8a7f6e5174599", "level": "note", "message": {"text": "Unused endpoint: POST /import-mapped"}, "properties": {"repobilityId": "ee930ec7f99c5c3a", "scanner": "scanner-primary", "fingerprint": "aae8a7f6e5174599", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be4cb5e3cabcce80", "level": "note", "message": {"text": "Unused endpoint: POST /import"}, "properties": {"repobilityId": "f616161889e6f9f9", "scanner": "scanner-primary", "fingerprint": "be4cb5e3cabcce80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-435f11cb90fdd400", "level": "note", "message": {"text": "Unused endpoint: POST /enrich"}, "properties": {"repobilityId": "ee98cdbd4a0e9945", "scanner": "scanner-primary", "fingerprint": "435f11cb90fdd400", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b542899f7d5b7cf", "level": "note", "message": {"text": "Unused endpoint: GET /{lead_id}"}, "properties": {"repobilityId": "6d1bf7c7ec51f270", "scanner": "scanner-primary", "fingerprint": "7b542899f7d5b7cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a3b7be566836532e", "level": "note", "message": {"text": "Unused endpoint: GET /{lead_id}/emails"}, "properties": {"repobilityId": "d5b087ebf7aecf58", "scanner": "scanner-primary", "fingerprint": "a3b7be566836532e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0bb266d8ddabb98", "level": "note", "message": {"text": "Unused endpoint: PUT /{lead_id}/personalization"}, "properties": {"repobilityId": "b8471240e2031b46", "scanner": "scanner-primary", "fingerprint": "e0bb266d8ddabb98", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b30f4c0994a30b4", "level": "note", "message": {"text": "Unused endpoint: DELETE /"}, "properties": {"repobilityId": "9dd4df2fcfa69db1", "scanner": "scanner-primary", "fingerprint": "3b30f4c0994a30b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68b3008dcf240037", "level": "note", "message": {"text": "Unused endpoint: DELETE /{lead_id}"}, "properties": {"repobilityId": "07083ca82860e2b8", "scanner": "scanner-primary", "fingerprint": "68b3008dcf240037", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b7bee247ffc801", "level": "note", "message": {"text": "Unused endpoint: GET /summary"}, "properties": {"repobilityId": "1be9f83c8774ad32", "scanner": "scanner-primary", "fingerprint": "e1b7bee247ffc801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e2cd3d05d94888a", "level": "note", "message": {"text": "Unused endpoint: GET /sent"}, "properties": {"repobilityId": "b2efcf915ab99f06", "scanner": "scanner-primary", "fingerprint": "7e2cd3d05d94888a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-470082cf718c6af5", "level": "note", "message": {"text": "Unused endpoint: GET /sent/{lead_id}/timeline"}, "properties": {"repobilityId": "d087a48ca4ffbaa3", "scanner": "scanner-primary", "fingerprint": "470082cf718c6af5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-833166601f18ed4b", "level": "note", "message": {"text": "Unused endpoint: GET /sent/campaigns"}, "properties": {"repobilityId": "3a14ea2d0a0ca4fd", "scanner": "scanner-primary", "fingerprint": "833166601f18ed4b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac2f552bf9d967ce", "level": "note", "message": {"text": "Unused endpoint: GET /overview"}, "properties": {"repobilityId": "6dd97a23056a98fa", "scanner": "scanner-primary", "fingerprint": "ac2f552bf9d967ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf8708f93c5621bc", "level": "note", "message": {"text": "Unused endpoint: GET /timeline"}, "properties": {"repobilityId": "839898be840a0d5c", "scanner": "scanner-primary", "fingerprint": "bf8708f93c5621bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-43ea6878bfcf0f12", "level": "note", "message": {"text": "Unused endpoint: GET /ab-tests"}, "properties": {"repobilityId": "ee8ad1e8d5b89e5a", "scanner": "scanner-primary", "fingerprint": "43ea6878bfcf0f12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0701f1a61a779432", "level": "note", "message": {"text": "Unused endpoint: GET /sending-accounts"}, "properties": {"repobilityId": "ec9b4e74009d5451", "scanner": "scanner-primary", "fingerprint": "0701f1a61a779432", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de0fbb72ab9b7cec", "level": "note", "message": {"text": "Unused endpoint: GET /campaign-comparison"}, "properties": {"repobilityId": "43f0cb75e2e7af95", "scanner": "scanner-primary", "fingerprint": "de0fbb72ab9b7cec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e5f346161dec29c", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/script.js"}, "properties": {"repobilityId": "28ec919dffcadbc5", "scanner": "scanner-primary", "fingerprint": "0e5f346161dec29c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}