{"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-3a6ad7f0dfb768d9", "name": "Possibly dead Python function: repl", "shortDescription": {"text": "Possibly dead Python function: repl"}, "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-cb7f462fd713a268", "name": "Possibly dead Python function: repl", "shortDescription": {"text": "Possibly dead Python function: repl"}, "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-8478ae79494dfed5", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-acb2feeabc3c86ca", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-ca3eb650071db1d0", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-754973c2a23af54d", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-eb5789bc53abaa4c", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-025981396fbc9a7c", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-1174d338eff249cc", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-f4246853a2cc3b47", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-18748b54dc5d6bad", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-8e1a8549327e6b51", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-a2e4cab972b9182f", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-affd19700b4c4c1b", "name": "Possibly dead Python function: ipv4_only", "shortDescription": {"text": "Possibly dead Python function: ipv4_only"}, "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-9cd0af6472383ca2", "name": "Possibly dead Python function: is_builder_active", "shortDescription": {"text": "Possibly dead Python function: is_builder_active"}, "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-806721dfa2e6536c", "name": "Possibly dead Python function: compute_completion", "shortDescription": {"text": "Possibly dead Python function: compute_completion"}, "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-74196f5f7ef44fca", "name": "Possibly dead Python function: require_lender", "shortDescription": {"text": "Possibly dead Python function: require_lender"}, "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-c6e2299e8bdce98d", "name": "Possibly dead Python function: all_subitem_codes", "shortDescription": {"text": "Possibly dead Python function: all_subitem_codes"}, "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-e36dbffbfcc2bc3b", "name": "Possibly dead Python function: to_payload", "shortDescription": {"text": "Possibly dead Python function: to_payload"}, "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-9b9012423d75cbda", "name": "Possibly dead Python function: require_super_admin", "shortDescription": {"text": "Possibly dead Python function: require_super_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-8e35761efbee2ec9", "name": "Possibly dead Python function: require_kyc_approved", "shortDescription": {"text": "Possibly dead Python function: require_kyc_approved"}, "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-3d06a90a5f3c04e5", "name": "Possibly dead Python function: require_feature", "shortDescription": {"text": "Possibly dead Python function: require_feature"}, "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-705773cd0e0c5d31", "name": "Possibly dead Python function: log_comm_audit", "shortDescription": {"text": "Possibly dead Python function: log_comm_audit"}, "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-5b0438d38b11376b", "name": "Icon-only button without accessible name \u2014 apps/web/src/App.tsx:92", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/src/App.tsx:92"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a4e88f1ecee5eb2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ProfileIndicator.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ProfileIndicator.tsx:104"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a873171751b8838", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/BuilderUpdatesPanel.tsx:29", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/BuilderUpdatesPanel.tsx:29"}, "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-bdcd88f880e40982", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/profiling/OpportunityMatchesPanel.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/profiling/OpportunityMatchesPanel.tsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1cc4e196522ea418", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/share/ShareModal.tsx:770", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/share/ShareModal.tsx:770"}, "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-c05906ec9ed02055", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/eoi/ExpressInterestModal.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/eoi/ExpressInterestModal.tsx:120"}, "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-f6cc0c9e9c49154a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/ProjectUpdatesPopup.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/ProjectUpdatesPopup.tsx:36"}, "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-d98fc0c3affe6c3c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/TransactionDetailsPopup.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/TransactionDetailsPopup.tsx:200"}, "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-cd01d7047c9485d1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/BuilderInvestorTransactionsPopup.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/BuilderInvestorTransactionsPopup.tsx:101"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e31b43774c09b84", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/LedgerEntryModal.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/LedgerEntryModal.tsx:231"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30173317901f4f3f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/knowledge/KnowledgeArticleModal.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/knowledge/KnowledgeArticleModal.tsx:154"}, "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-b3f1da82f18c083f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shield/ShieldDocLink.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shield/ShieldDocLink.tsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d7e49c473cf7ff9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shield/AdminShieldReviewTab.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shield/AdminShieldReviewTab.tsx:157"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-764bc109dcf62f22", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shield/SecureDocViewer.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shield/SecureDocViewer.tsx:70"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9450b5920b9c207", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/comm/MessagesLog.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/comm/MessagesLog.tsx:36"}, "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-1b11c3cca3c31337", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/comm/TemplateLibrary.tsx:29", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/comm/TemplateLibrary.tsx:29"}, "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-4b6b6741c9548f48", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/comm/ProvidersConfig.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/comm/ProvidersConfig.tsx:114"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-933e3dbb925938c6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ui/Card.tsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ui/Card.tsx:69"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a82349a582a99eb4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ui/Select.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ui/Select.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-45ca4e4986b191d2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderListingDetailPage.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderListingDetailPage.tsx:183"}, "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-5fa4eb258a42c096", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/PortfolioPage.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/PortfolioPage.tsx:308"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ad222260e88f470e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/MarketplacePage.tsx:537", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/MarketplacePage.tsx:537"}, "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-fc8f1dc091a7f162", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/PropertyDetailPage.tsx:327", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/PropertyDetailPage.tsx:327"}, "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-2cbf95f47b79c98e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderDocumentsPage.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderDocumentsPage.tsx:186"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-45324dd0bf392b0b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SettingsPage.tsx:880", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SettingsPage.tsx:880"}, "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-a045449ca124ed7e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/VaultAnalyticsDashboard.tsx:430", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/VaultAnalyticsDashboard.tsx:430"}, "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-ea4c8533cbc3344c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderListingsPage.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderListingsPage.tsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a74579c03e872876", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/OpportunityDetailPage.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/OpportunityDetailPage.tsx:179"}, "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-4e7316b14c1652bb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/ApprovalsPage.tsx:805", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/ApprovalsPage.tsx:805"}, "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-64502c65c566a103", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/InvestorDashboardPage.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/InvestorDashboardPage.tsx:97"}, "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-24ecde6d26ad7ac6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderProfilePage.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderProfilePage.tsx: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-28b803d5e9967a81", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderAnalyticsPage.tsx:184", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderAnalyticsPage.tsx:184"}, "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-2b7e0a04d1259fd1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/AdminReferralsPage.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/AdminReferralsPage.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c75c80c990d2e6f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/KnowledgeHubTab.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/KnowledgeHubTab.tsx:35"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c3210946c421b55", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/VideoManagementTab.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/VideoManagementTab.tsx:205"}, "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-d58d2ee8492b1337", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/EOIPipelineTab.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/EOIPipelineTab.tsx:161"}, "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-cd513aa1c67fc51a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/MediaManagementTab.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/MediaManagementTab.tsx:87"}, "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-1c819934545ed9ce", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/BuilderQuestionsTab.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/BuilderQuestionsTab.tsx:124"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-55afb8604b7c5ded", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/ImageManagementTab.tsx:293", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/ImageManagementTab.tsx:293"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-419ef74c242338d4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/ReferralTrackingTab.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/ReferralTrackingTab.tsx:98"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6efb356c65f3d996", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/DealLifecycleTab.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/DealLifecycleTab.tsx:129"}, "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-5158a13e130608db", "name": "Privileged port 587 in use", "shortDescription": {"text": "Privileged port 587 in use"}, "fullDescription": {"text": "Port 587 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-2082b18e662772d4", "name": "Dockerfile runs as root: tests/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: tests/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-a9a841c6146facfa", "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-7673561931a5dd33", "name": "Dockerfile runs as root: apps/web/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/web/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-74e2e2316f173b7a", "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-4520ec0a2b3204f2", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx: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-8e3a1c1b0a5f043c", "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-e611a3c1783f8baf", "name": "Runtime dotenv file present in repo: apps/web/.env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: apps/web/.env.production"}, "fullDescription": {"text": "`apps/web/.env.production` looks like a runtime dotenv file. No high-confidence secret value was matched, but runtime dotenv files often drift into live credentials. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-45f2dcce84b450c6", "name": "Runtime dotenv file present in repo: apps/web/.env.local", "shortDescription": {"text": "Runtime dotenv file present in repo: apps/web/.env.local"}, "fullDescription": {"text": "`apps/web/.env.local` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_SENTRY_DSN, VITE_MAPBOX_TOKEN. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-3c7b7d066caa1ba4", "name": "Runtime dotenv file present in repo: services/api/.env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: services/api/.env.production"}, "fullDescription": {"text": "`services/api/.env.production` looks like a runtime dotenv file. It contains secret-looking assignments for ENCRYPTION_KEY, KYC_AWS_ACCESS_KEY_ID, KYC_AWS_SECRET_ACCESS_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-dce61694c261dc52", "name": "Runtime dotenv file present in repo: services/api/.env.local", "shortDescription": {"text": "Runtime dotenv file present in repo: services/api/.env.local"}, "fullDescription": {"text": "`services/api/.env.local` looks like a runtime dotenv file. It contains secret-looking assignments for JWT_SECRET_KEY, CLERK_WEBHOOK_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, RAZORPAY_KEY_ID. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-309d98ee3fcec5be", "name": "Possible secret in scripts/check_columns.py", "shortDescription": {"text": "Possible secret in scripts/check_columns.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-7a4902b622568794", "name": "Possible secret in scripts/list_tables.py", "shortDescription": {"text": "Possible secret in scripts/list_tables.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-8711509200918cc9", "name": "Possible secret in scripts/check_related_tables.py", "shortDescription": {"text": "Possible secret in scripts/check_related_tables.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-b6cb055af8188d91", "name": "Insecure pattern 'subprocess_shell_true' in scripts/run_db_replay_check.py:148", "shortDescription": {"text": "Insecure pattern 'subprocess_shell_true' in scripts/run_db_replay_check.py:148"}, "fullDescription": {"text": "Found a known-risky pattern (subprocess_shell_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-85fff93c907e1c11", "name": "Possible secret in scripts/check_user_columns.py", "shortDescription": {"text": "Possible secret in scripts/check_user_columns.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-632a0abd50f0d033", "name": "Insecure pattern 'local_storage_auth_token' in apps/web/src/stores/user.store.ts:46", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in apps/web/src/stores/user.store.ts:46"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-253907c8702cdb3c", "name": "Insecure pattern 'local_storage_auth_token' in apps/web/src/hooks/useBackendSync.ts:114", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in apps/web/src/hooks/useBackendSync.ts:114"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d5caed98a51a7bd", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/pages/MarketplacePage.tsx:568", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/pages/MarketplacePage.tsx:568"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ce40fa7cdc19d88b", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/pages/PropertyDetailPage.tsx:76", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/pages/PropertyDetailPage.tsx:76"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-07cb6dad9ac4014c", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/pages/OpportunityDetailPage.tsx:347", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/pages/OpportunityDetailPage.tsx:347"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5724b9c2d9e66695", "name": "Insecure pattern 'local_storage_auth_token' in apps/web/src/lib/api.ts:14", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in apps/web/src/lib/api.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42425af6364a93c8", "name": "Insecure pattern 'exec_used' in services/api/app/comm/audience.py:45", "shortDescription": {"text": "Insecure pattern 'exec_used' in services/api/app/comm/audience.py:45"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6e858378597f79bc", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "azure/login@v2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ca75471691a2533", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e714ee1337db4105", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-52d5d90fab6af483", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b53de30d06d9c3e2", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "azure/login@v2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65e4e55bb148cbd9", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-20f790c5723cea31", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-521949f6c40912f2", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c8ad2824fef8f4b1", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3cd14d6f45a87d58", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "azure/login@v2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4bf411a1bee458fb", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/download-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-09973a8340c6a6b4", "name": "Very large file: temp.tsx (1008 lines)", "shortDescription": {"text": "Very large file: temp.tsx (1008 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-1b16f6cf34f70242", "name": "Very large file: apps/web/src/pages/CreateOpportunityPage.tsx (2425 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/CreateOpportunityPage.tsx (2425 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-c7a287318d973238", "name": "Very large file: apps/web/src/pages/OpportunityDetailPage.tsx (1265 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/OpportunityDetailPage.tsx (1265 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-0d119e37e8674df6", "name": "Very large file: apps/web/src/pages/ApprovalsPage.tsx (1281 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/ApprovalsPage.tsx (1281 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-c15758e3ca224a29", "name": "Very large file: apps/web/src/pages/control/AdminSettingsTab.tsx (1183 lines)", "shortDescription": {"text": "Very large file: apps/web/src/pages/control/AdminSettingsTab.tsx (1183 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-150e2a74b79066d4", "name": "Very large file: services/api/app/routers/opportunities.py (1449 lines)", "shortDescription": {"text": "Very large file: services/api/app/routers/opportunities.py (1449 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-7767d64fef15392c", "name": "Very large file: services/api/alembic/versions/6471f537b4b0_add_consent_logs_table.py (3059 lines)", "shortDescription": {"text": "Very large file: services/api/alembic/versions/6471f537b4b0_add_consent_logs_table.py (3059 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33c45898c73df8ff", "name": "Node manifest has dependencies but no lockfile: packages/wealthspot-types/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/wealthspot-types/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a71c165f4087f810", "name": "Node manifest has dependencies but no lockfile: packages/wealthspot-api-client/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/wealthspot-api-client/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76ce892b5f906742", "name": "Node manifest has dependencies but no lockfile: tests/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: tests/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0c2205560692580", "name": "Node manifest has dependencies but no lockfile: apps/mobile/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/mobile/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 118 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 291 placeholder/mock markers across 68 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, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8e21f1982dde143d", "name": "Legacy-named symbol `power_backup` in packages/wealthspot-types/src/amenities.ts:82", "shortDescription": {"text": "Legacy-named symbol `power_backup` in packages/wealthspot-types/src/amenities.ts:82"}, "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-c9e4056ef9b4a389", "name": "Commented-code block (5 lines) in packages/wealthspot-types/src/amenities.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in packages/wealthspot-types/src/amenities.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73517f5a985a2898", "name": "Commented-code block (5 lines) in packages/wealthspot-types/src/assessments.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in packages/wealthspot-types/src/assessments.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56c6782c7e3538c2", "name": "Commented-code block (5 lines) in packages/wealthspot-api-client/src/client.ts:162", "shortDescription": {"text": "Commented-code block (5 lines) in packages/wealthspot-api-client/src/client.ts:162"}, "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-4870c93d42df0a38", "name": "Commented-code block (6 lines) in tests/api/tests/test_assessment_parity.py:35", "shortDescription": {"text": "Commented-code block (6 lines) in tests/api/tests/test_assessment_parity.py:35"}, "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-816ecd0461524c6f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/bff/kyc.bff.ts:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/bff/kyc.bff.ts:66"}, "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-2df59c6e5855b855", "name": "Commented-code block (5 lines) in apps/mobile/app/_layout.tsx:72", "shortDescription": {"text": "Commented-code block (5 lines) in apps/mobile/app/_layout.tsx:72"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04db145b22bfc65b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/lib/offlineQueue.ts:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/lib/offlineQueue.ts:67"}, "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-5f38236e2493e8c8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/services/bff/kyc.bff.ts:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/services/bff/kyc.bff.ts:77"}, "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-40d09a1489599258", "name": "Legacy-named symbol `list_objects_v2` in services/api/test_s3.py:34", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in services/api/test_s3.py:34"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e606eea972525289", "name": "Commented-code block (6 lines) in services/api/app/main.py:138", "shortDescription": {"text": "Commented-code block (6 lines) in services/api/app/main.py:138"}, "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-e8763de1dbf0cbda", "name": "Legacy-named symbol `model_copy` in services/api/app/routers/builder_updates.py:78", "shortDescription": {"text": "Legacy-named symbol `model_copy` in services/api/app/routers/builder_updates.py:78"}, "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-8bdffa280c4af94e", "name": "Commented-code block (5 lines) in services/api/app/core/config.py:53", "shortDescription": {"text": "Commented-code block (5 lines) in services/api/app/core/config.py:53"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-89d0a210c4a2b05a", "name": "Commented-code block (5 lines) in services/api/app/middleware/rate_limit.py:97", "shortDescription": {"text": "Commented-code block (5 lines) in services/api/app/middleware/rate_limit.py:97"}, "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-c9102cbf54e45a0b", "name": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/83740d25652a_add_cover_image_to", "shortDescription": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/83740d25652a_add_cover_image_to_opportunities.py:25"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b578303126dd16e", "name": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/7d518706f18a_lowercase_all_exis", "shortDescription": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/7d518706f18a_lowercase_all_existing_emails.py:49"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-658215bd41c7834f", "name": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/43619bfcc037_remove_cash_flows_", "shortDescription": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/43619bfcc037_remove_cash_flows_and_parcel_dimensions_.py:31"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-738e0ce0ed331192", "name": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/033_cms_seed.py:26", "shortDescription": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/033_cms_seed.py:26"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-250f57e8a1dbd3c5", "name": "4 env vars used in code but missing from .env.example", "shortDescription": {"text": "4 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEV`, `MODE`, `VITE_API_PROXY_TARGET`, `VITE_POSTHOG_HOST`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/poll_and_bind_cert.py:ipv4_only, scripts/add_custom_domain.py:ipv4_only, scripts/force_new_revision.py:ipv4_only, scripts/get_logs.py:ipv4_only\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/query_logs2.py:ipv4_only, scripts/query_logs.py:ipv4_only\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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nservices/api/app/schemas/opportunity.py:rewrite_urls, services/api/app/schemas/opportunity.py:rewrite_urls, services/api/app/schemas/opportunity.py:rewrite_urls, services/api/app/schemas/opportunity.py:rewrite_url\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-76a2f6818267a9a8", "name": "Near-duplicate function bodies in 8 places", "shortDescription": {"text": "Near-duplicate function bodies in 8 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nservices/api/app/comm/providers.py:send, services/api/app/comm/providers.py:send, services/api/app/comm/providers.py:send, services/api/app/comm/providers.py:send\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:\nservices/api/app/comm/api.py:send, services/api/app/comm/api.py:send, services/api/app/comm/api.py:send\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-a826277f514ae052", "name": "Frontend route `/dashboard` has no Link/navigate to it \u2014 tests/web/src/components/ProtectedRoute.test.tsx", "shortDescription": {"text": "Frontend route `/dashboard` has no Link/navigate to it \u2014 tests/web/src/components/ProtectedRoute.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3a1577a8005c554d", "name": "Frontend route `/invite/:token` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/invite/:token` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f0f6c035efddb0a6", "name": "Frontend route `/property/:slug` has no Link/navigate to it \u2014 tests/web/src/pages/PropertyDetailPage.test.tsx", "shortDescription": {"text": "Frontend route `/property/:slug` has no Link/navigate to it \u2014 tests/web/src/pages/PropertyDetailPage.test.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3ae8ae2a3a6936d", "name": "Frontend route `/insights/intrinsic-value` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/insights/intrinsic-value` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85dd4446b44edecf", "name": "Frontend route `/marketplace/:slug` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/marketplace/:slug` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0abef5680b70f586", "name": "Frontend route `/opportunity/:slug` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/opportunity/:slug` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-52d802242fd082e2", "name": "Frontend route `/builder/listings` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/builder/listings` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fbec135d86b552b4", "name": "Frontend route `/builder/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/builder/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b663cfcac4171e52", "name": "Frontend route `/community` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/community` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a2f1a0a35bdfe04c", "name": "Frontend route `/community/answer` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/community/answer` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bdff5fc893cbc5be", "name": "Frontend route `/portal/builder/listings/new` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/portal/builder/listings/new` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f7d9d56bc467d4a7", "name": "Frontend route `/portal/builder/listings/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/portal/builder/listings/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7e7a17110f1ce006", "name": "Frontend route `/portal/builder/listings/:id/edit` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/portal/builder/listings/:id/edit` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8eb990fa140e2a4a", "name": "Frontend route `/portal/builder/analytics` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/portal/builder/analytics` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b2dbd4d7d34416ef", "name": "Frontend route `/create-opportunity` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/create-opportunity` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ecfeb0557a19703f", "name": "Frontend route `/auth/kyc/identity` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/auth/kyc/identity` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-874e35e59e60c56f", "name": "Frontend route `/approvals` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/approvals` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d63574bfde5eb139", "name": "Frontend route `/portfolio/property/:propertyId` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/portfolio/property/:propertyId` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9ca3487b7b541f48", "name": "Frontend route `/contribute/wealth` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/contribute/wealth` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-55eaec8064d8086e", "name": "Frontend route `/contribute/time` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/contribute/time` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1da84f26bd77305d", "name": "Frontend route `/contribute/network` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/contribute/network` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ced19bb18f0abeed", "name": "Frontend route `/contribute/education` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/contribute/education` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-13680e1cb1defff0", "name": "Frontend route `/company-onboarding` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/company-onboarding` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-56151326920c72df", "name": "Frontend route `/vault-profiling` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/vault-profiling` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-caea50efa1d56c55", "name": "Frontend route `/vault-analytics` has no Link/navigate to it \u2014 apps/web/src/App.tsx", "shortDescription": {"text": "Frontend route `/vault-analytics` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-033aa5a2e8b78117", "name": "JS DELETE `/site-content/admin/${id}` admin endpoint without auth \u2014 apps/web/src/hooks/useSiteContent.ts:92", "shortDescription": {"text": "JS DELETE `/site-content/admin/${id}` admin endpoint without auth \u2014 apps/web/src/hooks/useSiteContent.ts:92"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b6b920e63c4cb422", "name": "JS POST `/founding-team/admin` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:33", "shortDescription": {"text": "JS POST `/founding-team/admin` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:33"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-108566de569f393a", "name": "JS PATCH `/founding-team/admin/${id}` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:48", "shortDescription": {"text": "JS PATCH `/founding-team/admin/${id}` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:48"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bfc207345710d690", "name": "JS DELETE `/founding-team/admin/${id}` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:63", "shortDescription": {"text": "JS DELETE `/founding-team/admin/${id}` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:63"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-12c36be2dbc3a377", "name": "JS POST `/founding-team/admin/${id}/photo` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.ts", "shortDescription": {"text": "JS POST `/founding-team/admin/${id}/photo` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:78"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04db1a87b5359140", "name": "FastAPI POST `review_approval` without auth dependency \u2014 services/api/app/routers/approvals.py:137", "shortDescription": {"text": "FastAPI POST `review_approval` without auth dependency \u2014 services/api/app/routers/approvals.py:137"}, "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-d683afece3c094c9", "name": "FastAPI POST `increment_source_click` without auth dependency \u2014 services/api/app/routers/source_clicks.py:94", "shortDescription": {"text": "FastAPI POST `increment_source_click` without auth dependency \u2014 services/api/app/routers/source_clicks.py:94"}, "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-f123d12754a61fe3", "name": "FastAPI POST `publish_event` without auth dependency \u2014 services/api/app/routers/comm.py:107", "shortDescription": {"text": "FastAPI POST `publish_event` without auth dependency \u2014 services/api/app/routers/comm.py:107"}, "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-db5002fe5ed587c3", "name": "FastAPI POST `otp_issue` without auth dependency \u2014 services/api/app/routers/comm.py:143", "shortDescription": {"text": "FastAPI POST `otp_issue` without auth dependency \u2014 services/api/app/routers/comm.py:143"}, "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-f824ae9bd235b9ba", "name": "FastAPI POST `otp_verify` without auth dependency \u2014 services/api/app/routers/comm.py:162", "shortDescription": {"text": "FastAPI POST `otp_verify` without auth dependency \u2014 services/api/app/routers/comm.py:162"}, "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-57a4c896bdeb72b5", "name": "FastAPI POST `create_event` without auth dependency \u2014 services/api/app/routers/comm.py:200", "shortDescription": {"text": "FastAPI POST `create_event` without auth dependency \u2014 services/api/app/routers/comm.py:200"}, "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-1d0da7d34ff7c524", "name": "FastAPI PATCH `update_event` without auth dependency \u2014 services/api/app/routers/comm.py:233", "shortDescription": {"text": "FastAPI PATCH `update_event` without auth dependency \u2014 services/api/app/routers/comm.py:233"}, "fullDescription": {"text": "`@router.patch` 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-5662b4f5ea309cf2", "name": "FastAPI POST `create_template` without auth dependency \u2014 services/api/app/routers/comm.py:277", "shortDescription": {"text": "FastAPI POST `create_template` without auth dependency \u2014 services/api/app/routers/comm.py:277"}, "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-d74cb180dbac1335", "name": "FastAPI POST `add_template_version` without auth dependency \u2014 services/api/app/routers/comm.py:317", "shortDescription": {"text": "FastAPI POST `add_template_version` without auth dependency \u2014 services/api/app/routers/comm.py:317"}, "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-547f544d2a82afa0", "name": "FastAPI POST `create_binding` without auth dependency \u2014 services/api/app/routers/comm.py:384", "shortDescription": {"text": "FastAPI POST `create_binding` without auth dependency \u2014 services/api/app/routers/comm.py:384"}, "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-1718d22ecce7929d", "name": "FastAPI PATCH `update_binding` without auth dependency \u2014 services/api/app/routers/comm.py:420", "shortDescription": {"text": "FastAPI PATCH `update_binding` without auth dependency \u2014 services/api/app/routers/comm.py:420"}, "fullDescription": {"text": "`@router.patch` 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-e817d58dbf4a96f7", "name": "FastAPI DELETE `delete_binding` without auth dependency \u2014 services/api/app/routers/comm.py:444", "shortDescription": {"text": "FastAPI DELETE `delete_binding` without auth dependency \u2014 services/api/app/routers/comm.py:444"}, "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-9fb7752c8c257c80", "name": "FastAPI POST `create_provider` without auth dependency \u2014 services/api/app/routers/comm.py:486", "shortDescription": {"text": "FastAPI POST `create_provider` without auth dependency \u2014 services/api/app/routers/comm.py:486"}, "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-0859f923eef074de", "name": "FastAPI PATCH `update_provider` without auth dependency \u2014 services/api/app/routers/comm.py:534", "shortDescription": {"text": "FastAPI PATCH `update_provider` without auth dependency \u2014 services/api/app/routers/comm.py:534"}, "fullDescription": {"text": "`@router.patch` 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-3d10c1fbbacf6833", "name": "FastAPI POST `add_suppression` without auth dependency \u2014 services/api/app/routers/comm.py:592", "shortDescription": {"text": "FastAPI POST `add_suppression` without auth dependency \u2014 services/api/app/routers/comm.py:592"}, "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-896d744376381a82", "name": "FastAPI DELETE `remove_suppression` without auth dependency \u2014 services/api/app/routers/comm.py:617", "shortDescription": {"text": "FastAPI DELETE `remove_suppression` without auth dependency \u2014 services/api/app/routers/comm.py:617"}, "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-d44534a58403dabb", "name": "FastAPI PATCH `update_user_preferences` without auth dependency \u2014 services/api/app/routers/comm.py:710", "shortDescription": {"text": "FastAPI PATCH `update_user_preferences` without auth dependency \u2014 services/api/app/routers/comm.py:710"}, "fullDescription": {"text": "`@router.patch` 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-c2969adf0f6f5d8c", "name": "FastAPI POST `refresh_token` without auth dependency \u2014 services/api/app/routers/auth.py:132", "shortDescription": {"text": "FastAPI POST `refresh_token` without auth dependency \u2014 services/api/app/routers/auth.py:132"}, "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-96cff4b68cb9abe4", "name": "FastAPI POST `clerk_webhook` without auth dependency \u2014 services/api/app/routers/webhooks.py:78", "shortDescription": {"text": "FastAPI POST `clerk_webhook` without auth dependency \u2014 services/api/app/routers/webhooks.py:78"}, "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-c23edd450e8f961f", "name": "FastAPI POST `razorpay_webhook` without auth dependency \u2014 services/api/app/routers/webhooks.py:193", "shortDescription": {"text": "FastAPI POST `razorpay_webhook` without auth dependency \u2014 services/api/app/routers/webhooks.py:193"}, "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-560cf2edf0f4bcd9", "name": "Dangling fetch: GET http://localhost:8000/api/v1/control-centre/appearance (test_api.js:1)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:8000/api/v1/control-centre/appearance (test_api.js:1)"}, "fullDescription": {"text": "`test_api.js:1` calls `GET http://localhost:8000/api/v1/control-centre/appearance` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:8000/api/v1/control-centre/appearance`\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}}]}}, "automationDetails": {"id": "repobility/24214"}, "properties": {"repository": "anilpabolu/WealthSpot", "repoUrl": "https://github.com/anilpabolu/WealthSpot", "branch": "main"}, "results": [{"ruleId": "scanner-3a6ad7f0dfb768d9", "level": "note", "message": {"text": "Possibly dead Python function: repl"}, "properties": {"repobilityId": "6f5d3779bbb8be8b", "scanner": "scanner-primary", "fingerprint": "3a6ad7f0dfb768d9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "fix_jsx.py:7"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb7f462fd713a268", "level": "note", "message": {"text": "Possibly dead Python function: repl"}, "properties": {"repobilityId": "6f5d3779bbb8be8b", "scanner": "scanner-primary", "fingerprint": "cb7f462fd713a268", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "fix_errors.py:7"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8478ae79494dfed5", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "8478ae79494dfed5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check_api.py:4"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-acb2feeabc3c86ca", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "acb2feeabc3c86ca", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/add_dns_records.py:4"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ca3eb650071db1d0", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "ca3eb650071db1d0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/poll_and_bind_cert.py:5"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-754973c2a23af54d", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "754973c2a23af54d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/query_logs2.py:5"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eb5789bc53abaa4c", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "eb5789bc53abaa4c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/update_cors.py:4"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-025981396fbc9a7c", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "025981396fbc9a7c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/add_custom_domain.py:5"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1174d338eff249cc", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "1174d338eff249cc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/add_cf_pages_domain.py:5"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f4246853a2cc3b47", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "f4246853a2cc3b47", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/force_new_revision.py:5"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-18748b54dc5d6bad", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "18748b54dc5d6bad", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/get_logs.py:5"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8e1a8549327e6b51", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "8e1a8549327e6b51", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/bind_cert.py:5"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a2e4cab972b9182f", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "a2e4cab972b9182f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/list_revisions.py:5"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-affd19700b4c4c1b", "level": "note", "message": {"text": "Possibly dead Python function: ipv4_only"}, "properties": {"repobilityId": "77b72170eca5043d", "scanner": "scanner-primary", "fingerprint": "affd19700b4c4c1b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/query_logs.py:5"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9cd0af6472383ca2", "level": "note", "message": {"text": "Possibly dead Python function: is_builder_active"}, "properties": {"repobilityId": "85cd3422e51ddd5a", "scanner": "scanner-primary", "fingerprint": "9cd0af6472383ca2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/models/user.py:166"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-806721dfa2e6536c", "level": "note", "message": {"text": "Possibly dead Python function: compute_completion"}, "properties": {"repobilityId": "23c3a4d261949a63", "scanner": "scanner-primary", "fingerprint": "806721dfa2e6536c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/assessments.py:492"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-74196f5f7ef44fca", "level": "note", "message": {"text": "Possibly dead Python function: require_lender"}, "properties": {"repobilityId": "18fc5c8fcbaed575", "scanner": "scanner-primary", "fingerprint": "74196f5f7ef44fca", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/lender.py:28"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c6e2299e8bdce98d", "level": "note", "message": {"text": "Possibly dead Python function: all_subitem_codes"}, "properties": {"repobilityId": "e3e479b43875ea5b", "scanner": "scanner-primary", "fingerprint": "c6e2299e8bdce98d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/core/assessments.py:365"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e36dbffbfcc2bc3b", "level": "note", "message": {"text": "Possibly dead Python function: to_payload"}, "properties": {"repobilityId": "322ffd4313ad6b63", "scanner": "scanner-primary", "fingerprint": "e36dbffbfcc2bc3b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/core/exceptions.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9b9012423d75cbda", "level": "note", "message": {"text": "Possibly dead Python function: require_super_admin"}, "properties": {"repobilityId": "074b0ccaba355f53", "scanner": "scanner-primary", "fingerprint": "9b9012423d75cbda", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/middleware/auth.py:110"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8e35761efbee2ec9", "level": "note", "message": {"text": "Possibly dead Python function: require_kyc_approved"}, "properties": {"repobilityId": "123898965b4656d9", "scanner": "scanner-primary", "fingerprint": "8e35761efbee2ec9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/middleware/auth.py:120"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3d06a90a5f3c04e5", "level": "note", "message": {"text": "Possibly dead Python function: require_feature"}, "properties": {"repobilityId": "2e79c80e868a2217", "scanner": "scanner-primary", "fingerprint": "3d06a90a5f3c04e5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/middleware/auth.py:132"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-705773cd0e0c5d31", "level": "note", "message": {"text": "Possibly dead Python function: log_comm_audit"}, "properties": {"repobilityId": "16ed4aa5aa48e08c", "scanner": "scanner-primary", "fingerprint": "705773cd0e0c5d31", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/comm/audit.py:19"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5b0438d38b11376b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/src/App.tsx:92"}, "properties": {"repobilityId": "794bbd6a88c82ddd", "scanner": "scanner-primary", "fingerprint": "5b0438d38b11376b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-2a4e88f1ecee5eb2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ProfileIndicator.tsx:104"}, "properties": {"repobilityId": "e2b2802f84b4ae31", "scanner": "scanner-primary", "fingerprint": "2a4e88f1ecee5eb2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a873171751b8838", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/BuilderUpdatesPanel.tsx:29"}, "properties": {"repobilityId": "f74f19525d3dded5", "scanner": "scanner-primary", "fingerprint": "3a873171751b8838", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bdcd88f880e40982", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/profiling/OpportunityMatchesPanel.tsx:93"}, "properties": {"repobilityId": "14466f09e4cf55b2", "scanner": "scanner-primary", "fingerprint": "bdcd88f880e40982", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1cc4e196522ea418", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/share/ShareModal.tsx:770"}, "properties": {"repobilityId": "e89a059c5fa89b42", "scanner": "scanner-primary", "fingerprint": "1cc4e196522ea418", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c05906ec9ed02055", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/eoi/ExpressInterestModal.tsx:120"}, "properties": {"repobilityId": "d30a72188030fea6", "scanner": "scanner-primary", "fingerprint": "c05906ec9ed02055", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6cc0c9e9c49154a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/ProjectUpdatesPopup.tsx:36"}, "properties": {"repobilityId": "26ab2a799430494d", "scanner": "scanner-primary", "fingerprint": "f6cc0c9e9c49154a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d98fc0c3affe6c3c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/TransactionDetailsPopup.tsx:200"}, "properties": {"repobilityId": "dda1fb1905abacac", "scanner": "scanner-primary", "fingerprint": "d98fc0c3affe6c3c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd01d7047c9485d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/BuilderInvestorTransactionsPopup.tsx:101"}, "properties": {"repobilityId": "e93b3f09fb1f552f", "scanner": "scanner-primary", "fingerprint": "cd01d7047c9485d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e31b43774c09b84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/portfolio/LedgerEntryModal.tsx:231"}, "properties": {"repobilityId": "ef9e82c2bb824a8a", "scanner": "scanner-primary", "fingerprint": "9e31b43774c09b84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30173317901f4f3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/knowledge/KnowledgeArticleModal.tsx:154"}, "properties": {"repobilityId": "26cb22ee101701ce", "scanner": "scanner-primary", "fingerprint": "30173317901f4f3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3f1da82f18c083f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shield/ShieldDocLink.tsx:38"}, "properties": {"repobilityId": "e2f6b1baefbec140", "scanner": "scanner-primary", "fingerprint": "b3f1da82f18c083f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d7e49c473cf7ff9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shield/AdminShieldReviewTab.tsx:157"}, "properties": {"repobilityId": "ec799f92779d5db7", "scanner": "scanner-primary", "fingerprint": "9d7e49c473cf7ff9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-764bc109dcf62f22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shield/SecureDocViewer.tsx:70"}, "properties": {"repobilityId": "ab367b7b010a1964", "scanner": "scanner-primary", "fingerprint": "764bc109dcf62f22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9450b5920b9c207", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/comm/MessagesLog.tsx:36"}, "properties": {"repobilityId": "2d0806860474fc21", "scanner": "scanner-primary", "fingerprint": "b9450b5920b9c207", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b11c3cca3c31337", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/comm/TemplateLibrary.tsx:29"}, "properties": {"repobilityId": "e919e65fd5f400cf", "scanner": "scanner-primary", "fingerprint": "1b11c3cca3c31337", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b6b6741c9548f48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/comm/ProvidersConfig.tsx:114"}, "properties": {"repobilityId": "19d22edd80d22f79", "scanner": "scanner-primary", "fingerprint": "4b6b6741c9548f48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-933e3dbb925938c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ui/Card.tsx:69"}, "properties": {"repobilityId": "fb6a08069e437de3", "scanner": "scanner-primary", "fingerprint": "933e3dbb925938c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a82349a582a99eb4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ui/Select.tsx:126"}, "properties": {"repobilityId": "09183baa1418cf25", "scanner": "scanner-primary", "fingerprint": "a82349a582a99eb4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-45ca4e4986b191d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderListingDetailPage.tsx:183"}, "properties": {"repobilityId": "4180fbf360822119", "scanner": "scanner-primary", "fingerprint": "45ca4e4986b191d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5fa4eb258a42c096", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/PortfolioPage.tsx:308"}, "properties": {"repobilityId": "c21dfef1d52e7e09", "scanner": "scanner-primary", "fingerprint": "5fa4eb258a42c096", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad222260e88f470e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/MarketplacePage.tsx:537"}, "properties": {"repobilityId": "0cbe69ac3bfb320c", "scanner": "scanner-primary", "fingerprint": "ad222260e88f470e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc8f1dc091a7f162", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/PropertyDetailPage.tsx:327"}, "properties": {"repobilityId": "0a110df1bc8a6634", "scanner": "scanner-primary", "fingerprint": "fc8f1dc091a7f162", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2cbf95f47b79c98e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderDocumentsPage.tsx:186"}, "properties": {"repobilityId": "d538800a2abc2209", "scanner": "scanner-primary", "fingerprint": "2cbf95f47b79c98e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-45324dd0bf392b0b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/SettingsPage.tsx:880"}, "properties": {"repobilityId": "22ac163bf1d64b7c", "scanner": "scanner-primary", "fingerprint": "45324dd0bf392b0b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a045449ca124ed7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/VaultAnalyticsDashboard.tsx:430"}, "properties": {"repobilityId": "06713566b178d121", "scanner": "scanner-primary", "fingerprint": "a045449ca124ed7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea4c8533cbc3344c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderListingsPage.tsx:78"}, "properties": {"repobilityId": "8fbc2e82c451aaeb", "scanner": "scanner-primary", "fingerprint": "ea4c8533cbc3344c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a74579c03e872876", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/OpportunityDetailPage.tsx:179"}, "properties": {"repobilityId": "5131e3ff972a8670", "scanner": "scanner-primary", "fingerprint": "a74579c03e872876", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e7316b14c1652bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/ApprovalsPage.tsx:805"}, "properties": {"repobilityId": "55fd5ac1fc7474f5", "scanner": "scanner-primary", "fingerprint": "4e7316b14c1652bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64502c65c566a103", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/InvestorDashboardPage.tsx:97"}, "properties": {"repobilityId": "ee2d842984af5ecf", "scanner": "scanner-primary", "fingerprint": "64502c65c566a103", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24ecde6d26ad7ac6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderProfilePage.tsx:50"}, "properties": {"repobilityId": "3fceea37bc399362", "scanner": "scanner-primary", "fingerprint": "24ecde6d26ad7ac6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-28b803d5e9967a81", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/BuilderAnalyticsPage.tsx:184"}, "properties": {"repobilityId": "36f86ae6127d4a1b", "scanner": "scanner-primary", "fingerprint": "28b803d5e9967a81", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b7e0a04d1259fd1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/AdminReferralsPage.tsx:126"}, "properties": {"repobilityId": "1539167df458bb89", "scanner": "scanner-primary", "fingerprint": "2b7e0a04d1259fd1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c75c80c990d2e6f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/KnowledgeHubTab.tsx:35"}, "properties": {"repobilityId": "165a88bfe27233c6", "scanner": "scanner-primary", "fingerprint": "1c75c80c990d2e6f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c3210946c421b55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/VideoManagementTab.tsx:205"}, "properties": {"repobilityId": "36299f2e01846a76", "scanner": "scanner-primary", "fingerprint": "4c3210946c421b55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d58d2ee8492b1337", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/EOIPipelineTab.tsx:161"}, "properties": {"repobilityId": "d8017229fb133c15", "scanner": "scanner-primary", "fingerprint": "d58d2ee8492b1337", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd513aa1c67fc51a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/MediaManagementTab.tsx:87"}, "properties": {"repobilityId": "b3aa326782ec085f", "scanner": "scanner-primary", "fingerprint": "cd513aa1c67fc51a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c819934545ed9ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/BuilderQuestionsTab.tsx:124"}, "properties": {"repobilityId": "835aad4ca1faa24a", "scanner": "scanner-primary", "fingerprint": "1c819934545ed9ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55afb8604b7c5ded", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/ImageManagementTab.tsx:293"}, "properties": {"repobilityId": "ff20f5eb511f4abb", "scanner": "scanner-primary", "fingerprint": "55afb8604b7c5ded", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-419ef74c242338d4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/ReferralTrackingTab.tsx:98"}, "properties": {"repobilityId": "54bd7410146803b2", "scanner": "scanner-primary", "fingerprint": "419ef74c242338d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6efb356c65f3d996", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/pages/control/DealLifecycleTab.tsx:129"}, "properties": {"repobilityId": "15828e40e73ffd94", "scanner": "scanner-primary", "fingerprint": "6efb356c65f3d996", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5158a13e130608db", "level": "warning", "message": {"text": "Privileged port 587 in use"}, "properties": {"repobilityId": "a87a96c3b2e62c08", "scanner": "scanner-primary", "fingerprint": "5158a13e130608db", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/.env.production.example"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2082b18e662772d4", "level": "warning", "message": {"text": "Dockerfile runs as root: tests/Dockerfile"}, "properties": {"repobilityId": "5d1837a4f63f3fc2", "scanner": "scanner-primary", "fingerprint": "2082b18e662772d4", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-a9a841c6146facfa", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "60b9d4a8a004c95a", "scanner": "scanner-primary", "fingerprint": "a9a841c6146facfa", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tests/Dockerfile"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-7673561931a5dd33", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/web/Dockerfile"}, "properties": {"repobilityId": "d68d7937b96d047d", "scanner": "scanner-primary", "fingerprint": "7673561931a5dd33", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-74e2e2316f173b7a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "9b76ddc77fa88ab8", "scanner": "scanner-primary", "fingerprint": "74e2e2316f173b7a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-4520ec0a2b3204f2", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine"}, "properties": {"repobilityId": "fa73d33b2d17c609", "scanner": "scanner-primary", "fingerprint": "4520ec0a2b3204f2", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-74e2e2316f173b7a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "0c0622f0c63ed233", "scanner": "scanner-primary", "fingerprint": "74e2e2316f173b7a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-8e3a1c1b0a5f043c", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "8f25bf43fc59ee6a", "scanner": "scanner-primary", "fingerprint": "8e3a1c1b0a5f043c", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-8e3a1c1b0a5f043c", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "1b2ca7ed118630c8", "scanner": "scanner-primary", "fingerprint": "8e3a1c1b0a5f043c", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/Dockerfile"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-8e3a1c1b0a5f043c", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "463cd3ff41fec1fb", "scanner": "scanner-primary", "fingerprint": "8e3a1c1b0a5f043c", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/Dockerfile"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-e611a3c1783f8baf", "level": "error", "message": {"text": "Runtime dotenv file present in repo: apps/web/.env.production"}, "properties": {"repobilityId": "73e02f1b896586eb", "scanner": "scanner-primary", "fingerprint": "e611a3c1783f8baf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/.env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-45f2dcce84b450c6", "level": "error", "message": {"text": "Runtime dotenv file present in repo: apps/web/.env.local"}, "properties": {"repobilityId": "720f0b6a625492cb", "scanner": "scanner-primary", "fingerprint": "45f2dcce84b450c6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/.env.local"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3c7b7d066caa1ba4", "level": "error", "message": {"text": "Runtime dotenv file present in repo: services/api/.env.production"}, "properties": {"repobilityId": "a27fc52939c9964d", "scanner": "scanner-primary", "fingerprint": "3c7b7d066caa1ba4", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/.env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dce61694c261dc52", "level": "error", "message": {"text": "Runtime dotenv file present in repo: services/api/.env.local"}, "properties": {"repobilityId": "7f995dce453f8a4e", "scanner": "scanner-primary", "fingerprint": "dce61694c261dc52", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/.env.local"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-309d98ee3fcec5be", "level": "error", "message": {"text": "Possible secret in scripts/check_columns.py"}, "properties": {"repobilityId": "0054bd874a97c4c9", "scanner": "scanner-primary", "fingerprint": "309d98ee3fcec5be", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check_columns.py"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-7a4902b622568794", "level": "error", "message": {"text": "Possible secret in scripts/list_tables.py"}, "properties": {"repobilityId": "c1976f4c8bee5063", "scanner": "scanner-primary", "fingerprint": "7a4902b622568794", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/list_tables.py"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-8711509200918cc9", "level": "error", "message": {"text": "Possible secret in scripts/check_related_tables.py"}, "properties": {"repobilityId": "482ed7b7aa7a2b95", "scanner": "scanner-primary", "fingerprint": "8711509200918cc9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check_related_tables.py"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-b6cb055af8188d91", "level": "error", "message": {"text": "Insecure pattern 'subprocess_shell_true' in scripts/run_db_replay_check.py:148"}, "properties": {"repobilityId": "0bfbcaba51aac8ae", "scanner": "scanner-primary", "fingerprint": "b6cb055af8188d91", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "subprocess_shell_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/run_db_replay_check.py"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-85fff93c907e1c11", "level": "error", "message": {"text": "Possible secret in scripts/check_user_columns.py"}, "properties": {"repobilityId": "cba8d5975899c855", "scanner": "scanner-primary", "fingerprint": "85fff93c907e1c11", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check_user_columns.py"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-632a0abd50f0d033", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in apps/web/src/stores/user.store.ts:46"}, "properties": {"repobilityId": "66b2134bb6682c7d", "scanner": "scanner-primary", "fingerprint": "632a0abd50f0d033", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/stores/user.store.ts"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-253907c8702cdb3c", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in apps/web/src/hooks/useBackendSync.ts:114"}, "properties": {"repobilityId": "805af2356d1e4dad", "scanner": "scanner-primary", "fingerprint": "253907c8702cdb3c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/hooks/useBackendSync.ts"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-9d5caed98a51a7bd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/pages/MarketplacePage.tsx:568"}, "properties": {"repobilityId": "79b4d48fdd0f6a97", "scanner": "scanner-primary", "fingerprint": "9d5caed98a51a7bd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/MarketplacePage.tsx"}, "region": {"startLine": 568}}}]}, {"ruleId": "scanner-ce40fa7cdc19d88b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/pages/PropertyDetailPage.tsx:76"}, "properties": {"repobilityId": "a0b55e477c453a19", "scanner": "scanner-primary", "fingerprint": "ce40fa7cdc19d88b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/PropertyDetailPage.tsx"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-07cb6dad9ac4014c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/pages/OpportunityDetailPage.tsx:347"}, "properties": {"repobilityId": "3c8df4687fa86fa7", "scanner": "scanner-primary", "fingerprint": "07cb6dad9ac4014c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/OpportunityDetailPage.tsx"}, "region": {"startLine": 347}}}]}, {"ruleId": "scanner-5724b9c2d9e66695", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in apps/web/src/lib/api.ts:14"}, "properties": {"repobilityId": "fe176b4484ff2bd4", "scanner": "scanner-primary", "fingerprint": "5724b9c2d9e66695", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/lib/api.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-42425af6364a93c8", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in services/api/app/comm/audience.py:45"}, "properties": {"repobilityId": "2f12c61b17cf07df", "scanner": "scanner-primary", "fingerprint": "42425af6364a93c8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/comm/audience.py"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-6e858378597f79bc", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "312e401e9198cd81", "scanner": "scanner-primary", "fingerprint": "6e858378597f79bc", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/debug-aca.yml"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-4ca75471691a2533", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "28b8d95cb4ea9bed", "scanner": "scanner-primary", "fingerprint": "4ca75471691a2533", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/debug-aca.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e714ee1337db4105", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "61b0a27742bb31d0", "scanner": "scanner-primary", "fingerprint": "e714ee1337db4105", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/run-migrations.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-e714ee1337db4105", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6ca589e034ab87c4", "scanner": "scanner-primary", "fingerprint": "e714ee1337db4105", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/run-migrations.yml"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-52d5d90fab6af483", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "5f7a0426ab39dc9a", "scanner": "scanner-primary", "fingerprint": "52d5d90fab6af483", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/run-migrations.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b53de30d06d9c3e2", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fe0a9ed71b1fc33d", "scanner": "scanner-primary", "fingerprint": "b53de30d06d9c3e2", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/diagnose-api.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-65e4e55bb148cbd9", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "9905f69dc36d05f4", "scanner": "scanner-primary", "fingerprint": "65e4e55bb148cbd9", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/diagnose-api.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-20f790c5723cea31", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bcc2295a665d49e6", "scanner": "scanner-primary", "fingerprint": "20f790c5723cea31", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-replay-staging.yml"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-20f790c5723cea31", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "63b12858fbc44724", "scanner": "scanner-primary", "fingerprint": "20f790c5723cea31", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-replay-staging.yml"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-521949f6c40912f2", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "4467b168c1e877a1", "scanner": "scanner-primary", "fingerprint": "521949f6c40912f2", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-replay-staging.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c8ad2824fef8f4b1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2d06246ad0d0ced5", "scanner": "scanner-primary", "fingerprint": "c8ad2824fef8f4b1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-web.yml"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-c8ad2824fef8f4b1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0caac54d106003c9", "scanner": "scanner-primary", "fingerprint": "c8ad2824fef8f4b1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-web.yml"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-c8ad2824fef8f4b1", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a8489bfd6c74408d", "scanner": "scanner-primary", "fingerprint": "c8ad2824fef8f4b1", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-web.yml"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-3cd14d6f45a87d58", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2b46898a70fd2fb8", "scanner": "scanner-primary", "fingerprint": "3cd14d6f45a87d58", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-3cd14d6f45a87d58", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2f1ee592c9575445", "scanner": "scanner-primary", "fingerprint": "3cd14d6f45a87d58", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api.yml"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-3cd14d6f45a87d58", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2b46898a70fd2fb8", "scanner": "scanner-primary", "fingerprint": "3cd14d6f45a87d58", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api.yml"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-4bf411a1bee458fb", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "24d7fc6a4b25c421", "scanner": "scanner-primary", "fingerprint": "4bf411a1bee458fb", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-api.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0dc55539758d3645", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 284}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-09973a8340c6a6b4", "level": "note", "message": {"text": "Very large file: temp.tsx (1008 lines)"}, "properties": {"repobilityId": "9ebfb777f9880c16", "scanner": "scanner-primary", "fingerprint": "09973a8340c6a6b4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1b16f6cf34f70242", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/CreateOpportunityPage.tsx (2425 lines)"}, "properties": {"repobilityId": "763570df343fd284", "scanner": "scanner-primary", "fingerprint": "1b16f6cf34f70242", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c7a287318d973238", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/OpportunityDetailPage.tsx (1265 lines)"}, "properties": {"repobilityId": "20a7e68d0711be96", "scanner": "scanner-primary", "fingerprint": "c7a287318d973238", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0d119e37e8674df6", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/ApprovalsPage.tsx (1281 lines)"}, "properties": {"repobilityId": "9194c7d1a65f05d8", "scanner": "scanner-primary", "fingerprint": "0d119e37e8674df6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c15758e3ca224a29", "level": "note", "message": {"text": "Very large file: apps/web/src/pages/control/AdminSettingsTab.tsx (1183 lines)"}, "properties": {"repobilityId": "fb788f392a287f37", "scanner": "scanner-primary", "fingerprint": "c15758e3ca224a29", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-150e2a74b79066d4", "level": "note", "message": {"text": "Very large file: services/api/app/routers/opportunities.py (1449 lines)"}, "properties": {"repobilityId": "7e57f0f2ac10b494", "scanner": "scanner-primary", "fingerprint": "150e2a74b79066d4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7767d64fef15392c", "level": "note", "message": {"text": "Very large file: services/api/alembic/versions/6471f537b4b0_add_consent_logs_table.py (3059 lines)"}, "properties": {"repobilityId": "d3a725d37746d103", "scanner": "scanner-primary", "fingerprint": "7767d64fef15392c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "3b357d76772b1907", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-33c45898c73df8ff", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/wealthspot-types/package.json"}, "properties": {"repobilityId": "9b29fc07ab5c38d4", "scanner": "scanner-primary", "fingerprint": "33c45898c73df8ff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/wealthspot-types/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a71c165f4087f810", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/wealthspot-api-client/package.json"}, "properties": {"repobilityId": "be40b586a26c412d", "scanner": "scanner-primary", "fingerprint": "a71c165f4087f810", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/wealthspot-api-client/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-76ce892b5f906742", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: tests/package.json"}, "properties": {"repobilityId": "bcf934045db1aee9", "scanner": "scanner-primary", "fingerprint": "76ce892b5f906742", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tests/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d0c2205560692580", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/mobile/package.json"}, "properties": {"repobilityId": "b3dfed7bb3d70ed3", "scanner": "scanner-primary", "fingerprint": "d0c2205560692580", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/mobile/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "31a53cad75d55952", "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": "534305dbad9fb4d9", "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": "ecd1a6a63d7f06d9", "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": "048669e513eae9a0", "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": "7cb9f98d6227a1ee", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-8e21f1982dde143d", "level": "note", "message": {"text": "Legacy-named symbol `power_backup` in packages/wealthspot-types/src/amenities.ts:82"}, "properties": {"repobilityId": "76b33aa7bf2b268e", "scanner": "scanner-primary", "fingerprint": "8e21f1982dde143d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c9e4056ef9b4a389", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/wealthspot-types/src/amenities.ts:1"}, "properties": {"repobilityId": "e59d7dd8afd27b56", "scanner": "scanner-primary", "fingerprint": "c9e4056ef9b4a389", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73517f5a985a2898", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/wealthspot-types/src/assessments.ts:1"}, "properties": {"repobilityId": "2782483ed93c3c7d", "scanner": "scanner-primary", "fingerprint": "73517f5a985a2898", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56c6782c7e3538c2", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/wealthspot-api-client/src/client.ts:162"}, "properties": {"repobilityId": "99d2d76c260d3016", "scanner": "scanner-primary", "fingerprint": "56c6782c7e3538c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4870c93d42df0a38", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/api/tests/test_assessment_parity.py:35"}, "properties": {"repobilityId": "e35d1c759389d2dc", "scanner": "scanner-primary", "fingerprint": "4870c93d42df0a38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-816ecd0461524c6f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/services/bff/kyc.bff.ts:66"}, "properties": {"repobilityId": "91049237d16dac28", "scanner": "scanner-primary", "fingerprint": "816ecd0461524c6f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2df59c6e5855b855", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/mobile/app/_layout.tsx:72"}, "properties": {"repobilityId": "12e64880f34931f6", "scanner": "scanner-primary", "fingerprint": "2df59c6e5855b855", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04db145b22bfc65b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/lib/offlineQueue.ts:67"}, "properties": {"repobilityId": "689da40a1480a359", "scanner": "scanner-primary", "fingerprint": "04db145b22bfc65b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f38236e2493e8c8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/services/bff/kyc.bff.ts:77"}, "properties": {"repobilityId": "d6458f644c7940d2", "scanner": "scanner-primary", "fingerprint": "5f38236e2493e8c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-40d09a1489599258", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in services/api/test_s3.py:34"}, "properties": {"repobilityId": "27106320156ddd26", "scanner": "scanner-primary", "fingerprint": "40d09a1489599258", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e606eea972525289", "level": "none", "message": {"text": "Commented-code block (6 lines) in services/api/app/main.py:138"}, "properties": {"repobilityId": "ee54c780d7d044b7", "scanner": "scanner-primary", "fingerprint": "e606eea972525289", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8763de1dbf0cbda", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in services/api/app/routers/builder_updates.py:78"}, "properties": {"repobilityId": "4f1a4318e8b9a674", "scanner": "scanner-primary", "fingerprint": "e8763de1dbf0cbda", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8bdffa280c4af94e", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/api/app/core/config.py:53"}, "properties": {"repobilityId": "668d7091fd82e37d", "scanner": "scanner-primary", "fingerprint": "8bdffa280c4af94e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89d0a210c4a2b05a", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/api/app/middleware/rate_limit.py:97"}, "properties": {"repobilityId": "027ece2386ab91cc", "scanner": "scanner-primary", "fingerprint": "89d0a210c4a2b05a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c9102cbf54e45a0b", "level": "note", "message": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/83740d25652a_add_cover_image_to_opportunities.py:25"}, "properties": {"repobilityId": "2e85ed3388aea64f", "scanner": "scanner-primary", "fingerprint": "c9102cbf54e45a0b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-9b578303126dd16e", "level": "note", "message": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/7d518706f18a_lowercase_all_existing_emails.py:49"}, "properties": {"repobilityId": "b41a62c2336ec639", "scanner": "scanner-primary", "fingerprint": "9b578303126dd16e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-658215bd41c7834f", "level": "note", "message": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/43619bfcc037_remove_cash_flows_and_parcel_dimensions_.py:31"}, "properties": {"repobilityId": "adc9a563181fcfb8", "scanner": "scanner-primary", "fingerprint": "658215bd41c7834f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-738e0ce0ed331192", "level": "note", "message": {"text": "Stub function `downgrade` (body is just `pass`/`return`) \u2014 services/api/alembic/versions/033_cms_seed.py:26"}, "properties": {"repobilityId": "fa140e34e699ec7f", "scanner": "scanner-primary", "fingerprint": "738e0ce0ed331192", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-250f57e8a1dbd3c5", "level": "none", "message": {"text": "4 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "57584f22b735b5ee", "scanner": "scanner-primary", "fingerprint": "250f57e8a1dbd3c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "47e8c4a2d998cd78", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "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": "6b1ef60ae6eaed11", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "b49111841aa5c65d", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "bfdccbaa013b5485", "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": "a99fc14ac7c2e3eb", "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": "6b6e0c1c1402547e", "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": "ffe59e23635ba276", "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": "f4e92695e9b94fbc", "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": "174ded7c092d3374", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "b4d7b896e0d988fd", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "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": "b19dbe830c297d6b", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "d7695cdddc114bdf", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b8cb64bbf527e217", "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": "d7de3d31bd8317aa", "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": "c9c1c5435b7364bc", "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": "b855a27d5754e6fb", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-a826277f514ae052", "level": "warning", "message": {"text": "Frontend route `/dashboard` has no Link/navigate to it \u2014 tests/web/src/components/ProtectedRoute.test.tsx"}, "properties": {"repobilityId": "f3fdaf1ab3b97cb0", "scanner": "scanner-primary", "fingerprint": "a826277f514ae052", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3a1577a8005c554d", "level": "warning", "message": {"text": "Frontend route `/invite/:token` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "3f90d7ecd59e210c", "scanner": "scanner-primary", "fingerprint": "3a1577a8005c554d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f0f6c035efddb0a6", "level": "warning", "message": {"text": "Frontend route `/property/:slug` has no Link/navigate to it \u2014 tests/web/src/pages/PropertyDetailPage.test.tsx"}, "properties": {"repobilityId": "fc09802a71c16f2c", "scanner": "scanner-primary", "fingerprint": "f0f6c035efddb0a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a3ae8ae2a3a6936d", "level": "warning", "message": {"text": "Frontend route `/insights/intrinsic-value` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "ef0a0c5836b14dda", "scanner": "scanner-primary", "fingerprint": "a3ae8ae2a3a6936d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-85dd4446b44edecf", "level": "warning", "message": {"text": "Frontend route `/marketplace/:slug` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "2d1eaa3790e9ac7d", "scanner": "scanner-primary", "fingerprint": "85dd4446b44edecf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0abef5680b70f586", "level": "warning", "message": {"text": "Frontend route `/opportunity/:slug` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "77bd33ac478032bf", "scanner": "scanner-primary", "fingerprint": "0abef5680b70f586", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-52d802242fd082e2", "level": "warning", "message": {"text": "Frontend route `/builder/listings` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "540086acb106cfa4", "scanner": "scanner-primary", "fingerprint": "52d802242fd082e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fbec135d86b552b4", "level": "warning", "message": {"text": "Frontend route `/builder/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "18dd1355f7735f45", "scanner": "scanner-primary", "fingerprint": "fbec135d86b552b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b663cfcac4171e52", "level": "warning", "message": {"text": "Frontend route `/community` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "3937bc450aeeed67", "scanner": "scanner-primary", "fingerprint": "b663cfcac4171e52", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a2f1a0a35bdfe04c", "level": "warning", "message": {"text": "Frontend route `/community/answer` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "1a46823908c42234", "scanner": "scanner-primary", "fingerprint": "a2f1a0a35bdfe04c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bdff5fc893cbc5be", "level": "warning", "message": {"text": "Frontend route `/portal/builder/listings/new` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "d6c26c4f7e7b7019", "scanner": "scanner-primary", "fingerprint": "bdff5fc893cbc5be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f7d9d56bc467d4a7", "level": "warning", "message": {"text": "Frontend route `/portal/builder/listings/:id` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "8c4b1b311eea39ee", "scanner": "scanner-primary", "fingerprint": "f7d9d56bc467d4a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7e7a17110f1ce006", "level": "warning", "message": {"text": "Frontend route `/portal/builder/listings/:id/edit` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "fe56533949d0927a", "scanner": "scanner-primary", "fingerprint": "7e7a17110f1ce006", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8eb990fa140e2a4a", "level": "warning", "message": {"text": "Frontend route `/portal/builder/analytics` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "159e95d90586128f", "scanner": "scanner-primary", "fingerprint": "8eb990fa140e2a4a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b2dbd4d7d34416ef", "level": "warning", "message": {"text": "Frontend route `/create-opportunity` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "e252760abb7ae2c7", "scanner": "scanner-primary", "fingerprint": "b2dbd4d7d34416ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ecfeb0557a19703f", "level": "warning", "message": {"text": "Frontend route `/auth/kyc/identity` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "377cca14b28c6eb1", "scanner": "scanner-primary", "fingerprint": "ecfeb0557a19703f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-874e35e59e60c56f", "level": "warning", "message": {"text": "Frontend route `/approvals` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "80dafc5919447777", "scanner": "scanner-primary", "fingerprint": "874e35e59e60c56f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d63574bfde5eb139", "level": "warning", "message": {"text": "Frontend route `/portfolio/property/:propertyId` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "43e43f4245163c2d", "scanner": "scanner-primary", "fingerprint": "d63574bfde5eb139", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9ca3487b7b541f48", "level": "warning", "message": {"text": "Frontend route `/contribute/wealth` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "d5561ca030b06741", "scanner": "scanner-primary", "fingerprint": "9ca3487b7b541f48", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-55eaec8064d8086e", "level": "warning", "message": {"text": "Frontend route `/contribute/time` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "150fd2c4866f360e", "scanner": "scanner-primary", "fingerprint": "55eaec8064d8086e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1da84f26bd77305d", "level": "warning", "message": {"text": "Frontend route `/contribute/network` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "d82616bfab2ae4b3", "scanner": "scanner-primary", "fingerprint": "1da84f26bd77305d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ced19bb18f0abeed", "level": "warning", "message": {"text": "Frontend route `/contribute/education` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "335bac7f194878ef", "scanner": "scanner-primary", "fingerprint": "ced19bb18f0abeed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-13680e1cb1defff0", "level": "warning", "message": {"text": "Frontend route `/company-onboarding` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "22b1e6edd6c8a06b", "scanner": "scanner-primary", "fingerprint": "13680e1cb1defff0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-56151326920c72df", "level": "warning", "message": {"text": "Frontend route `/vault-profiling` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "7085bd9d40f3a8aa", "scanner": "scanner-primary", "fingerprint": "56151326920c72df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-caea50efa1d56c55", "level": "warning", "message": {"text": "Frontend route `/vault-analytics` has no Link/navigate to it \u2014 apps/web/src/App.tsx"}, "properties": {"repobilityId": "6308f85cc50f2b96", "scanner": "scanner-primary", "fingerprint": "caea50efa1d56c55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-033aa5a2e8b78117", "level": "error", "message": {"text": "JS DELETE `/site-content/admin/${id}` admin endpoint without auth \u2014 apps/web/src/hooks/useSiteContent.ts:92"}, "properties": {"repobilityId": "9f531c70edd26e2e", "scanner": "scanner-primary", "fingerprint": "033aa5a2e8b78117", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/hooks/useSiteContent.ts"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-b6b920e63c4cb422", "level": "error", "message": {"text": "JS POST `/founding-team/admin` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:33"}, "properties": {"repobilityId": "cf233e8bbb59b30e", "scanner": "scanner-primary", "fingerprint": "b6b920e63c4cb422", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/control/FoundingTeamPanel.tsx"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-108566de569f393a", "level": "error", "message": {"text": "JS PATCH `/founding-team/admin/${id}` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:48"}, "properties": {"repobilityId": "dd47d1ba1bb7b7e6", "scanner": "scanner-primary", "fingerprint": "108566de569f393a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/control/FoundingTeamPanel.tsx"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-bfc207345710d690", "level": "error", "message": {"text": "JS DELETE `/founding-team/admin/${id}` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:63"}, "properties": {"repobilityId": "5f1b9bf1b123127e", "scanner": "scanner-primary", "fingerprint": "bfc207345710d690", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/control/FoundingTeamPanel.tsx"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-12c36be2dbc3a377", "level": "error", "message": {"text": "JS POST `/founding-team/admin/${id}/photo` admin endpoint without auth \u2014 apps/web/src/pages/control/FoundingTeamPanel.tsx:78"}, "properties": {"repobilityId": "f0072e74b532fd3c", "scanner": "scanner-primary", "fingerprint": "12c36be2dbc3a377", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/pages/control/FoundingTeamPanel.tsx"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-04db1a87b5359140", "level": "error", "message": {"text": "FastAPI POST `review_approval` without auth dependency \u2014 services/api/app/routers/approvals.py:137"}, "properties": {"repobilityId": "8014a86641dbd576", "scanner": "scanner-primary", "fingerprint": "04db1a87b5359140", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/approvals.py"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-d683afece3c094c9", "level": "error", "message": {"text": "FastAPI POST `increment_source_click` without auth dependency \u2014 services/api/app/routers/source_clicks.py:94"}, "properties": {"repobilityId": "f4cd1d5daad992fb", "scanner": "scanner-primary", "fingerprint": "d683afece3c094c9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/source_clicks.py"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-f123d12754a61fe3", "level": "error", "message": {"text": "FastAPI POST `publish_event` without auth dependency \u2014 services/api/app/routers/comm.py:107"}, "properties": {"repobilityId": "d736b284ff71336e", "scanner": "scanner-primary", "fingerprint": "f123d12754a61fe3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-db5002fe5ed587c3", "level": "error", "message": {"text": "FastAPI POST `otp_issue` without auth dependency \u2014 services/api/app/routers/comm.py:143"}, "properties": {"repobilityId": "f4719afda672a95f", "scanner": "scanner-primary", "fingerprint": "db5002fe5ed587c3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-f824ae9bd235b9ba", "level": "error", "message": {"text": "FastAPI POST `otp_verify` without auth dependency \u2014 services/api/app/routers/comm.py:162"}, "properties": {"repobilityId": "9a8a500368c42ac9", "scanner": "scanner-primary", "fingerprint": "f824ae9bd235b9ba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 162}}}]}, {"ruleId": "scanner-57a4c896bdeb72b5", "level": "error", "message": {"text": "FastAPI POST `create_event` without auth dependency \u2014 services/api/app/routers/comm.py:200"}, "properties": {"repobilityId": "3147ec34154a5fc5", "scanner": "scanner-primary", "fingerprint": "57a4c896bdeb72b5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 200}}}]}, {"ruleId": "scanner-1d0da7d34ff7c524", "level": "error", "message": {"text": "FastAPI PATCH `update_event` without auth dependency \u2014 services/api/app/routers/comm.py:233"}, "properties": {"repobilityId": "40181e9c7c2a30da", "scanner": "scanner-primary", "fingerprint": "1d0da7d34ff7c524", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 233}}}]}, {"ruleId": "scanner-5662b4f5ea309cf2", "level": "error", "message": {"text": "FastAPI POST `create_template` without auth dependency \u2014 services/api/app/routers/comm.py:277"}, "properties": {"repobilityId": "b3880c7b40ed9f58", "scanner": "scanner-primary", "fingerprint": "5662b4f5ea309cf2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 277}}}]}, {"ruleId": "scanner-d74cb180dbac1335", "level": "error", "message": {"text": "FastAPI POST `add_template_version` without auth dependency \u2014 services/api/app/routers/comm.py:317"}, "properties": {"repobilityId": "8e3ded86060ae688", "scanner": "scanner-primary", "fingerprint": "d74cb180dbac1335", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 317}}}]}, {"ruleId": "scanner-547f544d2a82afa0", "level": "error", "message": {"text": "FastAPI POST `create_binding` without auth dependency \u2014 services/api/app/routers/comm.py:384"}, "properties": {"repobilityId": "73ef9183c7699ad2", "scanner": "scanner-primary", "fingerprint": "547f544d2a82afa0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 384}}}]}, {"ruleId": "scanner-1718d22ecce7929d", "level": "error", "message": {"text": "FastAPI PATCH `update_binding` without auth dependency \u2014 services/api/app/routers/comm.py:420"}, "properties": {"repobilityId": "77fa351a8fda5e24", "scanner": "scanner-primary", "fingerprint": "1718d22ecce7929d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 420}}}]}, {"ruleId": "scanner-e817d58dbf4a96f7", "level": "error", "message": {"text": "FastAPI DELETE `delete_binding` without auth dependency \u2014 services/api/app/routers/comm.py:444"}, "properties": {"repobilityId": "94f6ba8aadd6de72", "scanner": "scanner-primary", "fingerprint": "e817d58dbf4a96f7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 444}}}]}, {"ruleId": "scanner-9fb7752c8c257c80", "level": "error", "message": {"text": "FastAPI POST `create_provider` without auth dependency \u2014 services/api/app/routers/comm.py:486"}, "properties": {"repobilityId": "808f221fb6dbe332", "scanner": "scanner-primary", "fingerprint": "9fb7752c8c257c80", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 486}}}]}, {"ruleId": "scanner-0859f923eef074de", "level": "error", "message": {"text": "FastAPI PATCH `update_provider` without auth dependency \u2014 services/api/app/routers/comm.py:534"}, "properties": {"repobilityId": "2b198435f2dcb4bf", "scanner": "scanner-primary", "fingerprint": "0859f923eef074de", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 534}}}]}, {"ruleId": "scanner-3d10c1fbbacf6833", "level": "error", "message": {"text": "FastAPI POST `add_suppression` without auth dependency \u2014 services/api/app/routers/comm.py:592"}, "properties": {"repobilityId": "aa53754ab235ac98", "scanner": "scanner-primary", "fingerprint": "3d10c1fbbacf6833", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 592}}}]}, {"ruleId": "scanner-896d744376381a82", "level": "error", "message": {"text": "FastAPI DELETE `remove_suppression` without auth dependency \u2014 services/api/app/routers/comm.py:617"}, "properties": {"repobilityId": "e1ca1034e0625805", "scanner": "scanner-primary", "fingerprint": "896d744376381a82", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 617}}}]}, {"ruleId": "scanner-d44534a58403dabb", "level": "error", "message": {"text": "FastAPI PATCH `update_user_preferences` without auth dependency \u2014 services/api/app/routers/comm.py:710"}, "properties": {"repobilityId": "b1a2c0b869e05687", "scanner": "scanner-primary", "fingerprint": "d44534a58403dabb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/comm.py"}, "region": {"startLine": 710}}}]}, {"ruleId": "scanner-c2969adf0f6f5d8c", "level": "error", "message": {"text": "FastAPI POST `refresh_token` without auth dependency \u2014 services/api/app/routers/auth.py:132"}, "properties": {"repobilityId": "bc6a142043eff2bf", "scanner": "scanner-primary", "fingerprint": "c2969adf0f6f5d8c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/auth.py"}, "region": {"startLine": 132}}}]}, {"ruleId": "scanner-96cff4b68cb9abe4", "level": "error", "message": {"text": "FastAPI POST `clerk_webhook` without auth dependency \u2014 services/api/app/routers/webhooks.py:78"}, "properties": {"repobilityId": "f242e0d9fb8d7df5", "scanner": "scanner-primary", "fingerprint": "96cff4b68cb9abe4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/webhooks.py"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-c23edd450e8f961f", "level": "error", "message": {"text": "FastAPI POST `razorpay_webhook` without auth dependency \u2014 services/api/app/routers/webhooks.py:193"}, "properties": {"repobilityId": "da3a4c53926c08eb", "scanner": "scanner-primary", "fingerprint": "c23edd450e8f961f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/api/app/routers/webhooks.py"}, "region": {"startLine": 193}}}]}, {"ruleId": "scanner-560cf2edf0f4bcd9", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:8000/api/v1/control-centre/appearance (test_api.js:1)"}, "properties": {"repobilityId": "83e1b95e9997e0d7", "scanner": "scanner-primary", "fingerprint": "560cf2edf0f4bcd9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}]}]}