{"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-32c08b6b897fa89b", "name": "TODO/FIXME marker in shipping code \u2014 resources/js/finance/8582/form8582.ts:39", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 resources/js/finance/8582/form8582.ts:39"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7aa8dd7ac996e48c", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/finance/1116/F1116ReviewPanel.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/finance/1116/F1116ReviewPanel.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-f551f8544b5a98fc", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/class-action-tracker/ClassActionTracker.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/class-action-tracker/ClassActionTracker.tsx:1026"}, "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-f6bf4300a8c45089", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/LotReconciliationHealthWidget.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/LotReconciliationHealthWidget.tsx:125"}, "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-4fb1a2b1ff99d6a6", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/Form8949Preview.tsx:533", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/Form8949Preview.tsx:533"}, "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-c4b80f7bb02a81d3", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/CapitalGainsReconciliationPanel.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/CapitalGainsReconciliationPanel.tsx:424"}, "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-695e971f486d6278", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/ScheduleSEPreview.tsx:39", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/ScheduleSEPreview.tsx:39"}, "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-1b2cdc20f06776ed", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/SummaryClient.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/SummaryClient.tsx:76"}, "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-920ec2bbbbd1279d", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/K1MultiYearView.tsx:300", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/K1MultiYearView.tsx:300"}, "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-7fbd1f004a6d5126", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/ShortDividendDetailModal.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/ShortDividendDetailModal.tsx:96"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6307e60b9cf6e809", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/TaxDocumentReviewModal.tsx:538", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/TaxDocumentReviewModal.tsx:538"}, "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-40d7a06f93dc6144", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/K1AllInOneView.tsx:602", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/K1AllInOneView.tsx:602"}, "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-80856037b1002e4e", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/K3AllInOneView.tsx:621", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/K3AllInOneView.tsx:621"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e3b3cf6791e883a", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/TaxLotReconciliationPanel.tsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/TaxLotReconciliationPanel.tsx:258"}, "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-84da3ac94e9d8f62", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/SourceValueOverridesView.tsx:340", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/SourceValueOverridesView.tsx:340"}, "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-90b66c4f41210b3e", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/Form1116Preview.tsx:382", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/Form1116Preview.tsx:382"}, "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-fb330d884a27b30a", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/FinanceHomePage.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/FinanceHomePage.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-03a8ff43beb23eb0", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/ManageTagsPage.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/ManageTagsPage.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-f8933d5af12fca5b", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/statements/StatementPdfModal.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/statements/StatementPdfModal.tsx:30"}, "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-80ab2a555bec40a3", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/rules_engine/RuleRow.tsx:27", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/rules_engine/RuleRow.tsx:27"}, "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-60be734611bba7da", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/lots/shared/LotWorkspaceTable.tsx:8", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/lots/shared/LotWorkspaceTable.tsx:89"}, "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-376121145c8968b2", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/k1/K1ReviewPanel.tsx:182", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/k1/K1ReviewPanel.tsx:182"}, "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-5453c9f8c4ff3a4e", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/import_transactions/GenAiJobsList.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/import_transactions/GenAiJobsList.tsx:167"}, "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-64b3bf00b8caa144", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/tax-preview/ReadinessCards.tsx:275", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/tax-preview/ReadinessCards.tsx:275"}, "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-a6db59e86c240ecb", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/accounts/MissingAccountResolver.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/accounts/MissingAccountResolver.tsx:344"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c80dced9b3a4234", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/TaxFacet.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/TaxFacet.tsx:108"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d55dcb5316cf5677", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/StatementFacet.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/StatementFacet.tsx:61"}, "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-77da6041cd2eba8e", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/DocumentsTable.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/DocumentsTable.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-094419a3cf10f8a8", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/DocumentDetailDrawer.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/DocumentDetailDrawer.tsx:108"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c9a6c5a274d9e5d", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/payslip/PayslipImportJobCard.tsx:286", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/payslip/PayslipImportJobCard.tsx:286"}, "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-ca2520e69da73b02", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/payslip/PayslipDetailClient.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/payslip/PayslipDetailClient.tsx:284"}, "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-ca8585564d84425f", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/payslip/PayslipImportModal.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/payslip/PayslipImportModal.tsx:237"}, "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-f6881947a3d49dc0", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/rsu/RsuImportModal.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/rsu/RsuImportModal.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-7838a7f8d6d29c53", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/rsu/RsuImportJobCard.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/rsu/RsuImportJobCard.tsx:194"}, "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-f7e8acaea244869a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 resources/js/components/markdown/sanitizeSvg.ts:2", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 resources/js/components/markdown/sanitizeSvg.ts:2"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b3b0e24318bf66be", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 resources/js/components/markdown/MermaidBlock.tsx:98", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 resources/js/components/markdown/MermaidBlock.tsx:98"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-38141d0aba6b5c04", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/utility-bill-tracker/EditBillModal.tsx:421", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/utility-bill-tracker/EditBillModal.tsx:421"}, "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-bb5da1a1710b33c2", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/utility-bill-tracker/UtilityBillJobCard.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/utility-bill-tracker/UtilityBillJobCard.tsx:189"}, "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-426d7c6bdae2f3a2", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/utility-bill-tracker/ImportBillModal.tsx:16", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/utility-bill-tracker/ImportBillModal.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-739bc20389d9b371", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/planning/CareerComp/CareerCompForm.tsx:648", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/planning/CareerComp/CareerCompForm.tsx:648"}, "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-670e6e093cbbc9f8", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/planning/RothConversion/RothConversionForm.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/planning/RothConversion/RothConversionForm.tsx:251"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-68520b86067b9a2a", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/planning/RothConversion/RothConversionPage.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/planning/RothConversion/RothConversionPage.tsx:398"}, "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-1cdfa0abb4db21cd", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/ui/miller/MillerColumnShell.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/ui/miller/MillerColumnShell.tsx:164"}, "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-8aac2ca0ecaf7402", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/ui/miller/MillerDockHome.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/ui/miller/MillerDockHome.tsx:139"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ade3b2c41692a497", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/access/AccessPage.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/access/AccessPage.tsx:178"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8107c5beada4783", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/summary/SummaryPage.tsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/summary/SummaryPage.tsx:258"}, "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-d5f6ae69de22d3a1", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/imaging/ImagingPage.tsx:331", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/imaging/ImagingPage.tsx:331"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7dbcbfacb18cee11", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/imaging/ImagingStudyDetail.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/imaging/ImagingStudyDetail.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a528b7d36f5eed8a", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/patients/PatientList.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/patients/PatientList.tsx:33"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e111dd0e6fca8ce", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/documents/DocumentsPage.tsx:406", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/documents/DocumentsPage.tsx:406"}, "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-cb76f6ef8f4b7ae4", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/client-management/components/portal/ClientPortalExpens", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:238"}, "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-49edd70fc7c36a19", "name": "`truncate` class without `title=` for hover reveal \u2014 resources/js/client-management/components/portal/ProjectPageHeader.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/client-management/components/portal/ProjectPageHeader.tsx:116"}, "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-4b0520da0b5988fa", "name": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/devcontainers/php:8.5-bookworm", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/devcontainers/php:8.5-bookworm"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3c5c533aa0862623", "name": "Runtime dotenv file present in repo: .env.testing", "shortDescription": {"text": "Runtime dotenv file present in repo: .env.testing"}, "fullDescription": {"text": "`.env.testing` looks like a runtime dotenv file. It contains secret-looking assignments for APP_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-bb6268d77140ac23", "name": "Insecure pattern 'direct_innerhtml_assignment' in tests-ts/login-audit-section.test.tsx:53", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tests-ts/login-audit-section.test.tsx:53"}, "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-a3c68fe1202fc90e", "name": "Insecure pattern 'direct_innerhtml_assignment' in tests-ts/AgentAccessCard.test.tsx:22", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tests-ts/AgentAccessCard.test.tsx:22"}, "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-70d95712cc3d6ac5", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/finance/__tests__/TransactionDetailsModal.test", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/finance/__tests__/TransactionDetailsModal.test.tsx:69"}, "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-0966618d3bc0ae8e", "name": "Insecure pattern 'dangerous_innerhtml' in resources/js/components/markdown/MermaidBlock.tsx:98", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in resources/js/components/markdown/MermaidBlock.tsx:98"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ad0bc50b79ffc68", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/TimeEntryLi", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/TimeEntryListItem.invoice.test.tsx:40"}, "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-56d13c7f8d74a688", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/NewTimeEntr", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/NewTimeEntryModal.deferred.test.tsx:41"}, "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-0807b01cfb2aea79", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/NewTimeEntr", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/NewTimeEntryModal.test.tsx:12"}, "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-41f2c245d1013ad1", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/ClientPorta", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/ClientPortalNav.test.tsx:38"}, "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-a75e1033dd8a98fc", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/TimeEntryLi", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/TimeEntryListItem.deferred.test.tsx:40"}, "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-df91c7ebed007ab4", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/hydration.t", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/hydration.test.tsx:17"}, "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-fadd8d7d28f523ec", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/__tests__/portal-hydration.test.tsx:14", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/__tests__/portal-hydration.test.tsx:14"}, "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-2e9ab266fdf52e52", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/lib/__tests__/numberInputWheelGuard.dom.test.ts:18", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/lib/__tests__/numberInputWheelGuard.dom.test.ts:18"}, "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-39da2fd8d72ea4fa", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "pnpm/action-setup@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": "medium", "confidence": 1.0}}, {"id": "scanner-ebcbaef3e3637e74", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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-3fa7d323bfc461ed", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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-4fc1674942b750d5", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/github-script@v8 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-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "dorny/paths-filter@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": "medium", "confidence": 1.0}}, {"id": "scanner-b790b5dff379733e", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "pnpm/action-setup@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": "medium", "confidence": 1.0}}, {"id": "scanner-0d8137eb75b00a05", "name": "Very large file: tests-ts/washSaleEngine.test.ts (1188 lines)", "shortDescription": {"text": "Very large file: tests-ts/washSaleEngine.test.ts (1188 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-f7c86286a1c8c722", "name": "Very large file: resources/js/games/cars/gameEngine.ts (2145 lines)", "shortDescription": {"text": "Very large file: resources/js/games/cars/gameEngine.ts (2145 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-ca3ebf7423a1e889", "name": "Very large file: resources/js/components/class-action-tracker/ClassActionTracker.tsx (1632 lines)", "shortDescription": {"text": "Very large file: resources/js/components/class-action-tracker/ClassActionTracker.tsx (1632 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-04bf972cd46d0a31", "name": "Very large file: resources/js/components/finance/TaxDocumentReviewModal.tsx (1583 lines)", "shortDescription": {"text": "Very large file: resources/js/components/finance/TaxDocumentReviewModal.tsx (1583 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-047aeb3553e17dd2", "name": "Very large file: resources/js/components/finance/k1/K1ReviewPanel.tsx (2063 lines)", "shortDescription": {"text": "Very large file: resources/js/components/finance/k1/K1ReviewPanel.tsx (2063 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-05e1cdd51c3608d1", "name": "Very large file: resources/js/components/finance/tax-preview/registry.tsx (1458 lines)", "shortDescription": {"text": "Very large file: resources/js/components/finance/tax-preview/registry.tsx (1458 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-99d5c6df84d43ed4", "name": "Very large file: resources/js/components/planning/CareerComp/CareerCompForm.tsx (1967 lines)", "shortDescription": {"text": "Very large file: resources/js/components/planning/CareerComp/CareerCompForm.tsx (1967 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 6 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 369 placeholder/mock markers across 141 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2679282aa1c484b5", "name": "Agent authority lacks a verifier contract: AGENTS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b1d2ebb3fe2036f3", "name": "Agent authority lacks a verifier contract: GEMINI.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: GEMINI.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aef9872ebbd2b160", "name": "Agent authority lacks a verifier contract: .github/copilot-instructions.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .github/copilot-instructions.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-210a4ececb634f79", "name": "Agent authority lacks a verifier contract: .claude/skills/finance-mcp.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/finance-mcp.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6fb6e45b05b230ca", "name": "Commented-code block (5 lines) in tests-ts/washSaleEngine.test.ts:728", "shortDescription": {"text": "Commented-code block (5 lines) in tests-ts/washSaleEngine.test.ts:728"}, "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-ea689fa64198766f", "name": "Commented-code block (7 lines) in tests-ts/TaxPreviewContext.test.ts:14", "shortDescription": {"text": "Commented-code block (7 lines) in tests-ts/TaxPreviewContext.test.ts:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eab33e6946fdeb21", "name": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/fetchWrapper.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/fetchWrapper.ts:25"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d2cead9067958432", "name": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/genai-processor/useGenAiFileUpload.ts:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/genai-processor/useGenAiFileUpload.ts:61"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f8af1900701f96f2", "name": "Commented-code block (5 lines) in resources/js/games/marble-sort/MarbleSortScene.tsx:205", "shortDescription": {"text": "Commented-code block (5 lines) in resources/js/games/marble-sort/MarbleSortScene.tsx:205"}, "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-1a869c8baa5b7179", "name": "Commented-code block (7 lines) in resources/js/games/marble-sort/gameEngine.ts:208", "shortDescription": {"text": "Commented-code block (7 lines) in resources/js/games/marble-sort/gameEngine.ts:208"}, "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-397f0a2bb84aa924", "name": "Commented-code block (6 lines) in resources/js/games/marble-sort/scene/sceneConstants.ts:32", "shortDescription": {"text": "Commented-code block (6 lines) in resources/js/games/marble-sort/scene/sceneConstants.ts:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a00a426ead6dd03", "name": "Commented-code block (5 lines) in resources/js/games/marble-sort/scene/physics/world.ts:113", "shortDescription": {"text": "Commented-code block (5 lines) in resources/js/games/marble-sort/scene/physics/world.ts:113"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4620c1e2daa0486", "name": "Commented-code block (5 lines) in resources/js/games/cars/CarsScene.tsx:630", "shortDescription": {"text": "Commented-code block (5 lines) in resources/js/games/cars/CarsScene.tsx:630"}, "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-475a31b1bf0c981d", "name": "Commented-code block (6 lines) in resources/js/games/cars/scene/passengerLoopSlots.ts:63", "shortDescription": {"text": "Commented-code block (6 lines) in resources/js/games/cars/scene/passengerLoopSlots.ts:63"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bbc77871ebd15d84", "name": "Commented-code block (5 lines) in resources/js/types/finance/tax-return-k1.ts:174", "shortDescription": {"text": "Commented-code block (5 lines) in resources/js/types/finance/tax-return-k1.ts:174"}, "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-68357ec8488c9d06", "name": "Legacy-named symbol `notification_email_copy` in resources/js/components/class-action-tracker/ClassActionTracker.tsx:87", "shortDescription": {"text": "Legacy-named symbol `notification_email_copy` in resources/js/components/class-action-tracker/ClassActionTracker.tsx:87"}, "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-64d131209c1a2156", "name": "Legacy-named symbol `notification_email_copy` in resources/js/components/class-action-tracker/__tests__/ClassActionTrack", "shortDescription": {"text": "Legacy-named symbol `notification_email_copy` in resources/js/components/class-action-tracker/__tests__/ClassActionTracker.test.tsx:52"}, "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-4e3c0a841f80e8c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/components/finance/FinanceAccountsPage.tsx:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/components/finance/FinanceAccountsPage.tsx:36"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3976a18eb56876b8", "name": "Commented-code block (5 lines) in resources/js/components/finance/__tests__/Form8949Preview.test.tsx:147", "shortDescription": {"text": "Commented-code block (5 lines) in resources/js/components/finance/__tests__/Form8949Preview.test.tsx:147"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b1f64ee78e4e9d3d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/components/shared/FileManager.tsx:447", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/components/shared/FileManager.tsx:447"}, "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-ace455b2f032023f", "name": "Commented-code block (6 lines) in resources/js/components/markdown/__tests__/Preview.test.tsx:187", "shortDescription": {"text": "Commented-code block (6 lines) in resources/js/components/markdown/__tests__/Preview.test.tsx:187"}, "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-86bd24c00db4fe52", "name": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/components/utility-bill-tracker/EditBillModal.tsx:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/components/utility-bill-tracker/EditBillModal.tsx:132"}, "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-ff234ea91fbc4d48", "name": "Legacy-named symbol `withoutLegacy` in resources/js/components/planning/CareerComp/inputUtils.ts:33", "shortDescription": {"text": "Legacy-named symbol `withoutLegacy` in resources/js/components/planning/CareerComp/inputUtils.ts:33"}, "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-c839370f5cf1502a", "name": "Commented-code block (7 lines) in resources/js/components/planning/CareerComp/CareerCompForm.tsx:344", "shortDescription": {"text": "Commented-code block (7 lines) in resources/js/components/planning/CareerComp/CareerCompForm.tsx:344"}, "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-ee65f3dad7e05879", "name": "Legacy-named symbol `next_month_starting_unused` in resources/js/client-management/types/time-entry.ts:57", "shortDescription": {"text": "Legacy-named symbol `next_month_starting_unused` in resources/js/client-management/types/time-entry.ts:57"}, "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-f25b23a585a973d3", "name": "Legacy-named symbol `next_month_starting_unused` in resources/js/client-management/components/portal/ClientPortalTimePag", "shortDescription": {"text": "Legacy-named symbol `next_month_starting_unused` in resources/js/client-management/components/portal/ClientPortalTimePage.tsx:314"}, "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-5c5d32d0693439d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/client-management/components/portal/NewTimeEntryModal.tsx:154", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/client-management/components/portal/NewTimeEntryModal.tsx:154"}, "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-e5ff37bed4dde92c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/client-management/__tests__/portal-hydration.test.tsx:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/client-management/__tests__/portal-hydration.test.tsx:132"}, "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-c83e53b6b2c33ac2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/lib/api.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/lib/api.ts:6"}, "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-a0535e7cb5db1721", "name": "Commented-code block (9 lines) in resources/js/lib/finance/__tests__/k1Utils.test.ts:346", "shortDescription": {"text": "Commented-code block (9 lines) in resources/js/lib/finance/__tests__/k1Utils.test.ts:346"}, "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-d05fb818d8431384", "name": "Commented-code block (6 lines) in resources/js/lib/finance/__tests__/form8949Extraction.test.ts:143", "shortDescription": {"text": "Commented-code block (6 lines) in resources/js/lib/finance/__tests__/form8949Extraction.test.ts:143"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea06e259920617d2", "name": "Commented-code block (5 lines) in resources/js/lib/planning/__tests__/solo401k.test.ts:128", "shortDescription": {"text": "Commented-code block (5 lines) in resources/js/lib/planning/__tests__/solo401k.test.ts:128"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3482f7e5dd70cd1a", "name": "6 env vars used in code but missing from .env.example", "shortDescription": {"text": "6 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `JEST_EXCLUDE_GAME_TESTS`, `JEST_INCLUDE_SLOW_TESTS`, `JEST_INLINE_SOURCEMAPS`, `MODE`, `PLAYWRIGHT_BASE_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-13dcf9193ea45ce6", "name": "JS POST `/api/admin/tax-normalization-review/acknowledge` admin endpoint without auth \u2014 resources/js/components/admin/Ad", "shortDescription": {"text": "JS POST `/api/admin/tax-normalization-review/acknowledge` admin endpoint without auth \u2014 resources/js/components/admin/AdminTaxNormalizationPage.tsx:112"}, "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-731f305a0cbf2a3a", "name": "JS POST `/api/admin/genai-jobs/${job.id}/requeue` admin endpoint without auth \u2014 resources/js/components/admin/AdminGenAi", "shortDescription": {"text": "JS POST `/api/admin/genai-jobs/${job.id}/requeue` admin endpoint without auth \u2014 resources/js/components/admin/AdminGenAiJobsPage.tsx:109"}, "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-470a81f3996a2f34", "name": "JS POST `/api/admin/users` admin endpoint without auth \u2014 resources/js/components/user-management/CreateUserModal.tsx:50", "shortDescription": {"text": "JS POST `/api/admin/users` admin endpoint without auth \u2014 resources/js/components/user-management/CreateUserModal.tsx:50"}, "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-602020d60f7cf60a", "name": "JS POST `/api/admin/users/${user.id}/email` admin endpoint without auth \u2014 resources/js/components/user-management/UserAc", "shortDescription": {"text": "JS POST `/api/admin/users/${user.id}/email` admin endpoint without auth \u2014 resources/js/components/user-management/UserActionsModal.tsx:109"}, "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-f6f09c59e99b6297", "name": "JS POST `/api/admin/users/${user.id}/login-as` admin endpoint without auth \u2014 resources/js/components/user-management/Use", "shortDescription": {"text": "JS POST `/api/admin/users/${user.id}/login-as` admin endpoint without auth \u2014 resources/js/components/user-management/UserActionsModal.tsx:193"}, "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-7b82c0028c57cec0", "name": "Dangling fetch: GET /api/user (resources/js/dashboard.tsx:34)", "shortDescription": {"text": "Dangling fetch: GET /api/user (resources/js/dashboard.tsx:34)"}, "fullDescription": {"text": "`resources/js/dashboard.tsx:34` calls `GET /api/user` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/user`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-17febb8ffc4c5dc5", "name": "Dangling fetch: POST /api/user/update-api-key (resources/js/user/api-key.tsx:54)", "shortDescription": {"text": "Dangling fetch: POST /api/user/update-api-key (resources/js/user/api-key.tsx:54)"}, "fullDescription": {"text": "`resources/js/user/api-key.tsx:54` calls `POST /api/user/update-api-key` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/user/update-api-key`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-78a66c6f61c92546", "name": "Dangling fetch: POST /api/user/update-password (resources/js/user/update-password.tsx:28)", "shortDescription": {"text": "Dangling fetch: POST /api/user/update-password (resources/js/user/update-password.tsx:28)"}, "fullDescription": {"text": "`resources/js/user/update-password.tsx:28` calls `POST /api/user/update-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/user/update-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-651220625cb68980", "name": "Dangling fetch: GET /api/login-audit?page=${p} (resources/js/user/login-audit-section.tsx:44)", "shortDescription": {"text": "Dangling fetch: GET /api/login-audit?page=${p} (resources/js/user/login-audit-section.tsx:44)"}, "fullDescription": {"text": "`resources/js/user/login-audit-section.tsx:44` calls `GET /api/login-audit?page=${p}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/login-audit`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-43d064a78feda089", "name": "Dangling fetch: POST /api/login-audit/${id}/suspicious (resources/js/user/login-audit-section.tsx:66)", "shortDescription": {"text": "Dangling fetch: POST /api/login-audit/${id}/suspicious (resources/js/user/login-audit-section.tsx:66)"}, "fullDescription": {"text": "`resources/js/user/login-audit-section.tsx:66` calls `POST /api/login-audit/${id}/suspicious` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/login-audit/<p>/suspicious`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5f6811f442d20783", "name": "Dangling fetch: POST /api/user/update-email (resources/js/user/update-email.tsx:24)", "shortDescription": {"text": "Dangling fetch: POST /api/user/update-email (resources/js/user/update-email.tsx:24)"}, "fullDescription": {"text": "`resources/js/user/update-email.tsx:24` calls `POST /api/user/update-email` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/user/update-email`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c02903343855940a", "name": "Dangling fetch: POST /api/user/update-genai-quota (resources/js/user/genai-quota.tsx:33)", "shortDescription": {"text": "Dangling fetch: POST /api/user/update-genai-quota (resources/js/user/genai-quota.tsx:33)"}, "fullDescription": {"text": "`resources/js/user/genai-quota.tsx:33` calls `POST /api/user/update-genai-quota` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/user/update-genai-quota`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-88d05a0c30696ce8", "name": "Dangling fetch: GET /api/finance/chart (resources/js/components/finance/FinanceAccountsPage.tsx:55)", "shortDescription": {"text": "Dangling fetch: GET /api/finance/chart (resources/js/components/finance/FinanceAccountsPage.tsx:55)"}, "fullDescription": {"text": "`resources/js/components/finance/FinanceAccountsPage.tsx:55` calls `GET /api/finance/chart` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/finance/chart`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8a77f8b8ac4da53b", "name": "Dangling fetch: POST /api/finance/accounts/balance (resources/js/components/finance/EditBalanceDisplay.tsx:29)", "shortDescription": {"text": "Dangling fetch: POST /api/finance/accounts/balance (resources/js/components/finance/EditBalanceDisplay.tsx:29)"}, "fullDescription": {"text": "`resources/js/components/finance/EditBalanceDisplay.tsx:29` calls `POST /api/finance/accounts/balance` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/finance/accounts/balance`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fc5a5666548e480d", "name": "Dangling fetch: DELETE /api/genai/import/jobs/${deleteJobId} (resources/js/components/finance/import_transactions/GenAiJ", "shortDescription": {"text": "Dangling fetch: DELETE /api/genai/import/jobs/${deleteJobId} (resources/js/components/finance/import_transactions/GenAiJobsList.tsx:86)"}, "fullDescription": {"text": "`resources/js/components/finance/import_transactions/GenAiJobsList.tsx:86` calls `DELETE /api/genai/import/jobs/${deleteJobId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/genai/import/jobs/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5494edb4ca51f17b", "name": "Dangling fetch: GET /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/linkable (resources/js/components/u", "shortDescription": {"text": "Dangling fetch: GET /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/linkable (resources/js/components/utility-bill-tracker/LinkBillModal.tsx:34)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/LinkBillModal.tsx:34` calls `GET /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/linkable` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>/bills/<p>/linkable`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3ba2207911f933c7", "name": "Dangling fetch: POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/link (resources/js/components/util", "shortDescription": {"text": "Dangling fetch: POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/link (resources/js/components/utility-bill-tracker/LinkBillModal.tsx:62)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/LinkBillModal.tsx:62` calls `POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/link` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>/bills/<p>/link`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d1aca6f7ee731196", "name": "Dangling fetch: POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/unlink (resources/js/components/ut", "shortDescription": {"text": "Dangling fetch: POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/unlink (resources/js/components/utility-bill-tracker/LinkBillModal.tsx:89)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/LinkBillModal.tsx:89` calls `POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/unlink` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>/bills/<p>/unlink`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7603bcb351f5d2bb", "name": "Dangling fetch: GET /api/utility-bill-tracker/accounts/${accountId} (resources/js/components/utility-bill-tracker/Utilit", "shortDescription": {"text": "Dangling fetch: GET /api/utility-bill-tracker/accounts/${accountId} (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:51)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:51` calls `GET /api/utility-bill-tracker/accounts/${accountId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f445bf9e906be87d", "name": "Dangling fetch: GET /api/utility-bill-tracker/accounts/${accountId}/bills (resources/js/components/utility-bill-tracker/", "shortDescription": {"text": "Dangling fetch: GET /api/utility-bill-tracker/accounts/${accountId}/bills (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:52)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:52` calls `GET /api/utility-bill-tracker/accounts/${accountId}/bills` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>/bills`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a1741a5775f0b18c", "name": "Dangling fetch: PUT /api/utility-bill-tracker/accounts/${accountId}/notes (resources/js/components/utility-bill-tracker/", "shortDescription": {"text": "Dangling fetch: PUT /api/utility-bill-tracker/accounts/${accountId}/notes (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:84)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:84` calls `PUT /api/utility-bill-tracker/accounts/${accountId}/notes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>/notes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c8efe4b08197a3e5", "name": "Dangling fetch: POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/toggle-status (resources/js/compon", "shortDescription": {"text": "Dangling fetch: POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/toggle-status (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:132)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:132` calls `POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/toggle-status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>/bills/<p>/toggle-status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-95fea07a768a28cf", "name": "Dangling fetch: DELETE /api/utility-bill-tracker/accounts/${accountId}/bills/${selectedBill.id} (resources/js/components", "shortDescription": {"text": "Dangling fetch: DELETE /api/utility-bill-tracker/accounts/${accountId}/bills/${selectedBill.id} (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:166)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:166` calls `DELETE /api/utility-bill-tracker/accounts/${accountId}/bills/${selectedBill.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>/bills/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da46d0d13538bb93", "name": "Dangling fetch: DELETE /api/utility-bill-tracker/accounts/${accountId} (resources/js/components/utility-bill-tracker/Uti", "shortDescription": {"text": "Dangling fetch: DELETE /api/utility-bill-tracker/accounts/${accountId} (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:187)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:187` calls `DELETE /api/utility-bill-tracker/accounts/${accountId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-af075de28224413c", "name": "Dangling fetch: POST /api/utility-bill-tracker/accounts (resources/js/components/utility-bill-tracker/CreateAccountModal", "shortDescription": {"text": "Dangling fetch: POST /api/utility-bill-tracker/accounts (resources/js/components/utility-bill-tracker/CreateAccountModal.tsx:28)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/CreateAccountModal.tsx:28` calls `POST /api/utility-bill-tracker/accounts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-46d954ff8566bb38", "name": "Dangling fetch: GET /api/utility-bill-tracker/accounts (resources/js/components/utility-bill-tracker/UtilityAccountListP", "shortDescription": {"text": "Dangling fetch: GET /api/utility-bill-tracker/accounts (resources/js/components/utility-bill-tracker/UtilityAccountListPage.tsx:23)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/UtilityAccountListPage.tsx:23` calls `GET /api/utility-bill-tracker/accounts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5dd21e43468b2071", "name": "Dangling fetch: DELETE /api/utility-bill-tracker/accounts/${accountId}/bills/${currentBill.id}/pdf (resources/js/compone", "shortDescription": {"text": "Dangling fetch: DELETE /api/utility-bill-tracker/accounts/${accountId}/bills/${currentBill.id}/pdf (resources/js/components/utility-bill-tracker/EditBillModal.tsx:164)"}, "fullDescription": {"text": "`resources/js/components/utility-bill-tracker/EditBillModal.tsx:164` calls `DELETE /api/utility-bill-tracker/accounts/${accountId}/bills/${currentBill.id}/pdf` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/utility-bill-tracker/accounts/<p>/bills/<p>/pdf`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-29ec2880781d241b", "name": "Dangling fetch: POST /client/mgmt (resources/js/client-management/components/ClientManagementCreatePage.tsx:21)", "shortDescription": {"text": "Dangling fetch: POST /client/mgmt (resources/js/client-management/components/ClientManagementCreatePage.tsx:21)"}, "fullDescription": {"text": "`resources/js/client-management/components/ClientManagementCreatePage.tsx:21` calls `POST /client/mgmt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/mgmt`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1d3d94cc71900c64", "name": "Dangling fetch: POST /api/client/mgmt/companies/${companyId}/invoices/generate-all (resources/js/client-management/compo", "shortDescription": {"text": "Dangling fetch: POST /api/client/mgmt/companies/${companyId}/invoices/generate-all (resources/js/client-management/components/ClientAdminActions.tsx:37)"}, "fullDescription": {"text": "`resources/js/client-management/components/ClientAdminActions.tsx:37` calls `POST /api/client/mgmt/companies/${companyId}/invoices/generate-all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/mgmt/companies/<p>/invoices/generate-all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c751e3bd9619afe", "name": "Dangling fetch: GET /api/client/mgmt/companies/${companyId}/expenses (resources/js/client-management/components/portal/C", "shortDescription": {"text": "Dangling fetch: GET /api/client/mgmt/companies/${companyId}/expenses (resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:73)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:73` calls `GET /api/client/mgmt/companies/${companyId}/expenses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/mgmt/companies/<p>/expenses`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2bc3b5499ee66227", "name": "Dangling fetch: GET /api/client/portal/${slug}/projects (resources/js/client-management/components/portal/ClientPortalEx", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug}/projects (resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:87)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:87` calls `GET /api/client/portal/${slug}/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/projects`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5d13ee995aa4010e", "name": "Dangling fetch: POST /api/client/mgmt/companies/${companyId}/expenses/${expense.id}/mark-reimbursed (resources/js/client", "shortDescription": {"text": "Dangling fetch: POST /api/client/mgmt/companies/${companyId}/expenses/${expense.id}/mark-reimbursed (resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:104)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:104` calls `POST /api/client/mgmt/companies/${companyId}/expenses/${expense.id}/mark-reimbursed` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/mgmt/companies/<p>/expenses/<p>/mark-reimbursed`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-069deaa0604d0682", "name": "Dangling fetch: PUT /api/client/portal/${slug}/projects/${projectSlug} (resources/js/client-management/components/portal", "shortDescription": {"text": "Dangling fetch: PUT /api/client/portal/${slug}/projects/${projectSlug} (resources/js/client-management/components/portal/ProjectPageHeader.tsx:44)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ProjectPageHeader.tsx:44` calls `PUT /api/client/portal/${slug}/projects/${projectSlug}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/projects/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8d128c4ccb269800", "name": "Dangling fetch: GET /api/client/portal/${slug}/projects/${projectSlug}/tasks (resources/js/client-management/components/", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug}/projects/${projectSlug}/tasks (resources/js/client-management/components/portal/ClientPortalProjectPage.tsx:92)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalProjectPage.tsx:92` calls `GET /api/client/portal/${slug}/projects/${projectSlug}/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/projects/<p>/tasks`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6e67805a8312b2df", "name": "Dangling fetch: GET /api/client/portal/${slug} (resources/js/client-management/components/portal/ClientPortalProjectPage", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug} (resources/js/client-management/components/portal/ClientPortalProjectPage.tsx:106)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalProjectPage.tsx:106` calls `GET /api/client/portal/${slug}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab833e71336fc43d", "name": "Dangling fetch: PUT /api/client/portal/${slug}/projects/${projectSlug}/tasks/${task.id} (resources/js/client-management/", "shortDescription": {"text": "Dangling fetch: PUT /api/client/portal/${slug}/projects/${projectSlug}/tasks/${task.id} (resources/js/client-management/components/portal/ClientPortalProjectPage.tsx:137)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalProjectPage.tsx:137` calls `PUT /api/client/portal/${slug}/projects/${projectSlug}/tasks/${task.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/projects/<p>/tasks/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cb918aa1f929032d", "name": "Dangling fetch: DELETE /api/client/mgmt/companies/${companyId}/expenses/${expense.id} (resources/js/client-management/co", "shortDescription": {"text": "Dangling fetch: DELETE /api/client/mgmt/companies/${companyId}/expenses/${expense.id} (resources/js/client-management/components/portal/DeleteExpenseDialog.tsx:32)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/DeleteExpenseDialog.tsx:32` calls `DELETE /api/client/mgmt/companies/${companyId}/expenses/${expense.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/mgmt/companies/<p>/expenses/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-56938caf6fb6d0c9", "name": "Dangling fetch: PUT /api/client/portal/${slug}/projects/${projectSlug}/tasks/${task.id} (resources/js/client-management/", "shortDescription": {"text": "Dangling fetch: PUT /api/client/portal/${slug}/projects/${projectSlug}/tasks/${task.id} (resources/js/client-management/components/portal/EditTaskModal.tsx:94)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/EditTaskModal.tsx:94` calls `PUT /api/client/portal/${slug}/projects/${projectSlug}/tasks/${task.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/projects/<p>/tasks/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1501cbfa373c88fc", "name": "Dangling fetch: POST /api/client/portal/${slug}/time-entries (resources/js/client-management/components/portal/EditTaskM", "shortDescription": {"text": "Dangling fetch: POST /api/client/portal/${slug}/time-entries (resources/js/client-management/components/portal/EditTaskModal.tsx:135)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/EditTaskModal.tsx:135` calls `POST /api/client/portal/${slug}/time-entries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/time-entries`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34deefe8d3f82bd9", "name": "Dangling fetch: GET /api/client/portal/${slug}/time-entries (resources/js/client-management/components/portal/ClientPort", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug}/time-entries (resources/js/client-management/components/portal/ClientPortalTimePage.tsx:53)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalTimePage.tsx:53` calls `GET /api/client/portal/${slug}/time-entries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/time-entries`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9a83307b66332c45", "name": "Dangling fetch: GET /api/client/portal/${slug}/projects (resources/js/client-management/components/portal/ClientPortalTi", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug}/projects (resources/js/client-management/components/portal/ClientPortalTimePage.tsx:67)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalTimePage.tsx:67` calls `GET /api/client/portal/${slug}/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/projects`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1e3bbfc2034012d7", "name": "Dangling fetch: GET /api/client/portal/${slug} (resources/js/client-management/components/portal/ClientPortalTimePage.ts", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug} (resources/js/client-management/components/portal/ClientPortalTimePage.tsx:79)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalTimePage.tsx:79` calls `GET /api/client/portal/${slug}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ea7d18fb461c4591", "name": "Dangling fetch: POST /api/client/portal/${slug}/projects/${projectSlug}/tasks (resources/js/client-management/components", "shortDescription": {"text": "Dangling fetch: POST /api/client/portal/${slug}/projects/${projectSlug}/tasks (resources/js/client-management/components/portal/NewTaskModal.tsx:44)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/NewTaskModal.tsx:44` calls `POST /api/client/portal/${slug}/projects/${projectSlug}/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/projects/<p>/tasks`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c1f422bdf1c6b592", "name": "Dangling fetch: GET /api/user (resources/js/client-management/components/portal/NewTimeEntryModal.tsx:88)", "shortDescription": {"text": "Dangling fetch: GET /api/user (resources/js/client-management/components/portal/NewTimeEntryModal.tsx:88)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/NewTimeEntryModal.tsx:88` calls `GET /api/user` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/user`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b9215a1fe2f9c797", "name": "Dangling fetch: DELETE /api/client/portal/${slug}/time-entries/${entry.id} (resources/js/client-management/components/po", "shortDescription": {"text": "Dangling fetch: DELETE /api/client/portal/${slug}/time-entries/${entry.id} (resources/js/client-management/components/portal/NewTimeEntryModal.tsx:200)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/NewTimeEntryModal.tsx:200` calls `DELETE /api/client/portal/${slug}/time-entries/${entry.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/time-entries/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-816832b96e79614c", "name": "Dangling fetch: POST /api/client/portal/${slug}/projects (resources/js/client-management/components/portal/NewProjectMod", "shortDescription": {"text": "Dangling fetch: POST /api/client/portal/${slug}/projects (resources/js/client-management/components/portal/NewProjectModal.tsx:29)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/NewProjectModal.tsx:29` calls `POST /api/client/portal/${slug}/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/projects`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-444f186fbc07b993", "name": "Dangling fetch: GET /api/client/portal/${slug} (resources/js/client-management/components/portal/ClientPortalInvoicesPag", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug} (resources/js/client-management/components/portal/ClientPortalInvoicesPage.tsx:32)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalInvoicesPage.tsx:32` calls `GET /api/client/portal/${slug}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9083e9da4cce9ec7", "name": "Dangling fetch: GET /api/client/portal/${slug}/invoices (resources/js/client-management/components/portal/ClientPortalIn", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug}/invoices (resources/js/client-management/components/portal/ClientPortalInvoicesPage.tsx:44)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalInvoicesPage.tsx:44` calls `GET /api/client/portal/${slug}/invoices` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/invoices`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-59223d54b4aa2ccf", "name": "Dangling fetch: POST /api/client/mgmt/companies/${company.id}/invoices/generate-all (resources/js/client-management/comp", "shortDescription": {"text": "Dangling fetch: POST /api/client/mgmt/companies/${company.id}/invoices/generate-all (resources/js/client-management/components/portal/ClientPortalInvoicesPage.tsx:75)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalInvoicesPage.tsx:75` calls `POST /api/client/mgmt/companies/${company.id}/invoices/generate-all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/mgmt/companies/<p>/invoices/generate-all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-209ca38b51b85d2b", "name": "Dangling fetch: GET /api/client/portal/${slug}/agreements/${agreementId} (resources/js/client-management/components/port", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug}/agreements/${agreementId} (resources/js/client-management/components/portal/ClientPortalAgreementPage.tsx:52)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalAgreementPage.tsx:52` calls `GET /api/client/portal/${slug}/agreements/${agreementId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/agreements/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-362b84877e31152f", "name": "Dangling fetch: GET /api/client/portal/${slug}/invoices (resources/js/client-management/components/portal/ClientPortalAg", "shortDescription": {"text": "Dangling fetch: GET /api/client/portal/${slug}/invoices (resources/js/client-management/components/portal/ClientPortalAgreementPage.tsx:69)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalAgreementPage.tsx:69` calls `GET /api/client/portal/${slug}/invoices` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/invoices`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-153fa45b84d11c14", "name": "Dangling fetch: POST /api/client/portal/${slug}/agreements/${agreementId}/sign (resources/js/client-management/component", "shortDescription": {"text": "Dangling fetch: POST /api/client/portal/${slug}/agreements/${agreementId}/sign (resources/js/client-management/components/portal/ClientPortalAgreementPage.tsx:108)"}, "fullDescription": {"text": "`resources/js/client-management/components/portal/ClientPortalAgreementPage.tsx:108` calls `POST /api/client/portal/${slug}/agreements/${agreementId}/sign` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/client/portal/<p>/agreements/<p>/sign`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6acfd907fefad109", "name": "Dangling fetch: GET /api/user (resources/js/client-management/__tests__/portal-hydration.test.tsx:132)", "shortDescription": {"text": "Dangling fetch: GET /api/user (resources/js/client-management/__tests__/portal-hydration.test.tsx:132)"}, "fullDescription": {"text": "`resources/js/client-management/__tests__/portal-hydration.test.tsx:132` calls `GET /api/user` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/user`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-231198ea46edc434", "name": "Dangling fetch: DELETE /api/payslips/${payslip_id} (resources/js/lib/api.ts:42)", "shortDescription": {"text": "Dangling fetch: DELETE /api/payslips/${payslip_id} (resources/js/lib/api.ts:42)"}, "fullDescription": {"text": "`resources/js/lib/api.ts:42` calls `DELETE /api/payslips/${payslip_id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payslips/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2f4219ee7aa7258b", "name": "Dangling fetch: GET /api/payslips/${payslip_id} (resources/js/lib/api.ts:58)", "shortDescription": {"text": "Dangling fetch: GET /api/payslips/${payslip_id} (resources/js/lib/api.ts:58)"}, "fullDescription": {"text": "`resources/js/lib/api.ts:58` calls `GET /api/payslips/${payslip_id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payslips/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8977ca34e320320a", "name": "Dangling fetch: POST /api/payslips/${payslip_id}/estimated-status (resources/js/lib/api.ts:69)", "shortDescription": {"text": "Dangling fetch: POST /api/payslips/${payslip_id}/estimated-status (resources/js/lib/api.ts:69)"}, "fullDescription": {"text": "`resources/js/lib/api.ts:69` calls `POST /api/payslips/${payslip_id}/estimated-status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payslips/<p>/estimated-status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8b07df6b1c4f7477", "name": "Unused endpoint: POST /api/genai/import/request-upload", "shortDescription": {"text": "Unused endpoint: POST /api/genai/import/request-upload"}, "fullDescription": {"text": "`resources/js/genai-processor/useGenAiFileUpload.ts` declares `POST /api/genai/import/request-upload` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b6c9118bccc551d8", "name": "Unused endpoint: POST /api/genai/import/jobs", "shortDescription": {"text": "Unused endpoint: POST /api/genai/import/jobs"}, "fullDescription": {"text": "`resources/js/genai-processor/useGenAiFileUpload.ts` declares `POST /api/genai/import/jobs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a1e1e7ba2e17efd", "name": "Unused endpoint: GET /api/agent/setup-tokens", "shortDescription": {"text": "Unused endpoint: GET /api/agent/setup-tokens"}, "fullDescription": {"text": "`resources/js/user/agent-tokens.tsx` declares `GET /api/agent/setup-tokens` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8117499b063cab33", "name": "Unused endpoint: POST /api/user/generate-mcp-api-key", "shortDescription": {"text": "Unused endpoint: POST /api/user/generate-mcp-api-key"}, "fullDescription": {"text": "`resources/js/user/mcp-api-key.tsx` declares `POST /api/user/generate-mcp-api-key` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d7a856d8259e30d", "name": "Unused endpoint: GET /api/user/ai-prefs", "shortDescription": {"text": "Unused endpoint: GET /api/user/ai-prefs"}, "fullDescription": {"text": "`resources/js/user/ai-configurations/AiConfigurationsSection.tsx` declares `GET /api/user/ai-prefs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1eda6748c8a19b19", "name": "Unused endpoint: POST /api/user/ai-prefs/models", "shortDescription": {"text": "Unused endpoint: POST /api/user/ai-prefs/models"}, "fullDescription": {"text": "`resources/js/user/ai-configurations/AiConfigurationsSection.tsx` declares `POST /api/user/ai-prefs/models` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b257564718b12f3", "name": "Unused endpoint: POST /api/user/ai-prefs", "shortDescription": {"text": "Unused endpoint: POST /api/user/ai-prefs"}, "fullDescription": {"text": "`resources/js/user/ai-configurations/AiConfigurationsSection.tsx` declares `POST /api/user/ai-prefs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8122fef65f4b3afc", "name": "Unused endpoint: GET /api/class-action-claims", "shortDescription": {"text": "Unused endpoint: GET /api/class-action-claims"}, "fullDescription": {"text": "`resources/js/components/class-action-tracker/ClassActionTracker.tsx` declares `GET /api/class-action-claims` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d194554a54efc4f", "name": "Unused endpoint: POST /api/class-action-claims", "shortDescription": {"text": "Unused endpoint: POST /api/class-action-claims"}, "fullDescription": {"text": "`resources/js/components/class-action-tracker/ClassActionTracker.tsx` declares `POST /api/class-action-claims` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3a8f36daa01cf0b", "name": "Unused endpoint: POST /api/genai/import/paste", "shortDescription": {"text": "Unused endpoint: POST /api/genai/import/paste"}, "fullDescription": {"text": "`resources/js/components/class-action-tracker/ClassActionTracker.tsx` declares `POST /api/genai/import/paste` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c68982a4b46e2fe", "name": "Unused endpoint: POST /api/agent/setup-tokens", "shortDescription": {"text": "Unused endpoint: POST /api/agent/setup-tokens"}, "fullDescription": {"text": "`resources/js/components/class-action-tracker/ClassActionTracker.tsx` declares `POST /api/agent/setup-tokens` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23431077cf7f4c32", "name": "Unused endpoint: POST /api/finance/user-deductions", "shortDescription": {"text": "Unused endpoint: POST /api/finance/user-deductions"}, "fullDescription": {"text": "`resources/js/components/finance/UserDeductionsSection.tsx` declares `POST /api/finance/user-deductions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-def98fd76cbd70fe", "name": "Unused endpoint: POST /api/finance/tax-line-adjustments", "shortDescription": {"text": "Unused endpoint: POST /api/finance/tax-line-adjustments"}, "fullDescription": {"text": "`resources/js/components/finance/TaxLineAdjustmentPopover.tsx` declares `POST /api/finance/tax-line-adjustments` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-181408a4606378c6", "name": "Unused endpoint: POST /api/finance/tags/apply", "shortDescription": {"text": "Unused endpoint: POST /api/finance/tags/apply"}, "fullDescription": {"text": "`resources/js/components/finance/TransactionDetailsModal.tsx` declares `POST /api/finance/tags/apply` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17c3450326a83aad", "name": "Unused endpoint: POST /api/finance/tags/remove", "shortDescription": {"text": "Unused endpoint: POST /api/finance/tags/remove"}, "fullDescription": {"text": "`resources/js/components/finance/TransactionDetailsModal.tsx` declares `POST /api/finance/tags/remove` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85e94d582a645df0", "name": "Unused endpoint: POST /api/finance/transactions/batch-update", "shortDescription": {"text": "Unused endpoint: POST /api/finance/transactions/batch-update"}, "fullDescription": {"text": "`resources/js/components/finance/TransactionDetailsModal.tsx` declares `POST /api/finance/transactions/batch-update` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa29cb9fc967fbcf", "name": "Unused endpoint: PUT /api/finance/form-8829", "shortDescription": {"text": "Unused endpoint: PUT /api/finance/form-8829"}, "fullDescription": {"text": "`resources/js/components/finance/Form8829InputsForm.tsx` declares `PUT /api/finance/form-8829` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-67ea24575a4fe1a5", "name": "Unused endpoint: POST /api/finance/tax-documents/manual", "shortDescription": {"text": "Unused endpoint: POST /api/finance/tax-documents/manual"}, "fullDescription": {"text": "`resources/js/components/finance/ManualJsonAttachModal.tsx` declares `POST /api/finance/tax-documents/manual` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc658725a550b650", "name": "Unused endpoint: POST /api/finance/transactions/link", "shortDescription": {"text": "Unused endpoint: POST /api/finance/transactions/link"}, "fullDescription": {"text": "`resources/js/components/finance/TransactionLinkModal.tsx` declares `POST /api/finance/transactions/link` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-61502195f3b5f108", "name": "Unused endpoint: GET /api/finance/accounts/basic", "shortDescription": {"text": "Unused endpoint: GET /api/finance/accounts/basic"}, "fullDescription": {"text": "`resources/js/components/finance/useFinanceAccounts.ts` declares `GET /api/finance/accounts/basic` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05a101fbbee59ee2", "name": "Unused endpoint: GET /api/finance/employment-entities", "shortDescription": {"text": "Unused endpoint: GET /api/finance/employment-entities"}, "fullDescription": {"text": "`resources/js/components/finance/EmploymentEntitySection.tsx` declares `GET /api/finance/employment-entities` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-22860abd8ac4e1b5", "name": "Unused endpoint: POST /api/finance/employment-entities", "shortDescription": {"text": "Unused endpoint: POST /api/finance/employment-entities"}, "fullDescription": {"text": "`resources/js/components/finance/EmploymentEntitySection.tsx` declares `POST /api/finance/employment-entities` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee54390e6c3c59b2", "name": "Unused endpoint: GET /api/finance/schedule-c", "shortDescription": {"text": "Unused endpoint: GET /api/finance/schedule-c"}, "fullDescription": {"text": "`resources/js/components/finance/ScheduleCPreview.tsx` declares `GET /api/finance/schedule-c` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3f06917c584699c2", "name": "Unused endpoint: POST /api/finance/documents/request-upload", "shortDescription": {"text": "Unused endpoint: POST /api/finance/documents/request-upload"}, "fullDescription": {"text": "`resources/js/components/finance/DocumentImportModal.tsx` declares `POST /api/finance/documents/request-upload` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23fec2d1cc25c757", "name": "Unused endpoint: POST /api/finance/documents", "shortDescription": {"text": "Unused endpoint: POST /api/finance/documents"}, "fullDescription": {"text": "`resources/js/components/finance/DocumentImportModal.tsx` declares `POST /api/finance/documents` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d03f5d3dbd924218", "name": "Unused endpoint: GET /api/finance/employment-entities?visible_only=true", "shortDescription": {"text": "Unused endpoint: GET /api/finance/employment-entities?visible_only=true"}, "fullDescription": {"text": "`resources/js/components/finance/ManageTagsPage.tsx` declares `GET /api/finance/employment-entities?visible_only=true` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a89bf366be385030", "name": "Unused endpoint: POST /api/finance/tags", "shortDescription": {"text": "Unused endpoint: POST /api/finance/tags"}, "fullDescription": {"text": "`resources/js/components/finance/ManageTagsPage.tsx` declares `POST /api/finance/tags` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b3d026e62945ada", "name": "Unused endpoint: POST /api/finance/lot-reconciliation-links/relink", "shortDescription": {"text": "Unused endpoint: POST /api/finance/lot-reconciliation-links/relink"}, "fullDescription": {"text": "`resources/js/components/finance/LotReconciliationPage.tsx` declares `POST /api/finance/lot-reconciliation-links/relink` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2004f816ea1a7d71", "name": "Unused endpoint: POST /api/finance/user-tax-states", "shortDescription": {"text": "Unused endpoint: POST /api/finance/user-tax-states"}, "fullDescription": {"text": "`resources/js/components/finance/StateSelectorSection.tsx` declares `POST /api/finance/user-tax-states` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ccbb0ac5d36fc1de", "name": "Unused endpoint: GET /api/finance/rules", "shortDescription": {"text": "Unused endpoint: GET /api/finance/rules"}, "fullDescription": {"text": "`resources/js/components/finance/rules_engine/RulesList.tsx` declares `GET /api/finance/rules` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-570208b7a97c3a84", "name": "Unused endpoint: POST /api/finance/rules/reorder", "shortDescription": {"text": "Unused endpoint: POST /api/finance/rules/reorder"}, "fullDescription": {"text": "`resources/js/components/finance/rules_engine/RulesList.tsx` declares `POST /api/finance/rules/reorder` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9cc21ea01e204a89", "name": "Unused endpoint: POST /api/finance/rules", "shortDescription": {"text": "Unused endpoint: POST /api/finance/rules"}, "fullDescription": {"text": "`resources/js/components/finance/rules_engine/RuleEditorModal.tsx` declares `POST /api/finance/rules` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-54095523d64b1b57", "name": "Unused endpoint: POST /api/finance/rules/preview-matches", "shortDescription": {"text": "Unused endpoint: POST /api/finance/rules/preview-matches"}, "fullDescription": {"text": "`resources/js/components/finance/rules_engine/RuleEditorModal.tsx` declares `POST /api/finance/rules/preview-matches` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3cb131a3145770fc", "name": "Unused endpoint: POST /api/finance/lots/search-opening", "shortDescription": {"text": "Unused endpoint: POST /api/finance/lots/search-opening"}, "fullDescription": {"text": "`resources/js/components/finance/lots/LotMatchSearchModal.tsx` declares `POST /api/finance/lots/search-opening` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0a17c34d2b8d3a6", "name": "Unused endpoint: POST /api/finance/lots/save-assignment", "shortDescription": {"text": "Unused endpoint: POST /api/finance/lots/save-assignment"}, "fullDescription": {"text": "`resources/js/components/finance/lots/LotMatchSearchModal.tsx` declares `POST /api/finance/lots/save-assignment` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-67cb546db10ecde1", "name": "Unused endpoint: POST /api/finance/transactions/batch-delete", "shortDescription": {"text": "Unused endpoint: POST /api/finance/transactions/batch-delete"}, "fullDescription": {"text": "`resources/js/components/finance/transactionTable/TransactionsTable.tsx` declares `POST /api/finance/transactions/batch-delete` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd451241f3f1d828", "name": "Unused endpoint: GET /api/license-keys", "shortDescription": {"text": "Unused endpoint: GET /api/license-keys"}, "fullDescription": {"text": "`resources/js/components/license-manager/license-manager.tsx` declares `GET /api/license-keys` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4cb99df88fb4919e", "name": "Unused endpoint: POST /api/license-keys", "shortDescription": {"text": "Unused endpoint: POST /api/license-keys"}, "fullDescription": {"text": "`resources/js/components/license-manager/license-manager.tsx` declares `POST /api/license-keys` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8d5a6f96b176af1", "name": "Unused endpoint: POST /api/license-keys/import", "shortDescription": {"text": "Unused endpoint: POST /api/license-keys/import"}, "fullDescription": {"text": "`resources/js/components/license-manager/license-manager.tsx` declares `POST /api/license-keys/import` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33279a44214d2d71", "name": "Unused endpoint: POST /api/tools/toon-json/save", "shortDescription": {"text": "Unused endpoint: POST /api/tools/toon-json/save"}, "fullDescription": {"text": "`resources/js/components/toon-json/toonApi.ts` declares `POST /api/tools/toon-json/save` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c21241fbad22c92e", "name": "Unused endpoint: POST /api/admin/tax-normalization-review/acknowledge", "shortDescription": {"text": "Unused endpoint: POST /api/admin/tax-normalization-review/acknowledge"}, "fullDescription": {"text": "`resources/js/components/admin/AdminTaxNormalizationPage.tsx` declares `POST /api/admin/tax-normalization-review/acknowledge` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d87dcdf3bd8c6d20", "name": "Unused endpoint: POST /api/payslips/bulk", "shortDescription": {"text": "Unused endpoint: POST /api/payslips/bulk"}, "fullDescription": {"text": "`resources/js/components/payslip/PayslipJsonModal.tsx` declares `POST /api/payslips/bulk` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4d87f54d62a1386", "name": "Unused endpoint: GET /api/admin/users", "shortDescription": {"text": "Unused endpoint: GET /api/admin/users"}, "fullDescription": {"text": "`resources/js/components/user-management/UserManagementPage.tsx` declares `GET /api/admin/users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b934c95ab6afb042", "name": "Unused endpoint: GET /api/admin/feature-permissions", "shortDescription": {"text": "Unused endpoint: GET /api/admin/feature-permissions"}, "fullDescription": {"text": "`resources/js/components/user-management/UserManagementPage.tsx` declares `GET /api/admin/feature-permissions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4aa35f9c575955ad", "name": "Unused endpoint: POST /api/admin/users", "shortDescription": {"text": "Unused endpoint: POST /api/admin/users"}, "fullDescription": {"text": "`resources/js/components/user-management/CreateUserModal.tsx` declares `POST /api/admin/users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26200cd45df4ca97", "name": "Unused endpoint: GET /api/rsu", "shortDescription": {"text": "Unused endpoint: GET /api/rsu"}, "fullDescription": {"text": "`resources/js/components/rsu/RsuPage.tsx` declares `GET /api/rsu` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de17e3b36f378b0c", "name": "Unused endpoint: GET /api/financial-planning/career-comparison/latest", "shortDescription": {"text": "Unused endpoint: GET /api/financial-planning/career-comparison/latest"}, "fullDescription": {"text": "`resources/js/components/rsu/RsuPage.tsx` declares `GET /api/financial-planning/career-comparison/latest` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-82085e9be9ccacef", "name": "Unused endpoint: POST /api/rsu", "shortDescription": {"text": "Unused endpoint: POST /api/rsu"}, "fullDescription": {"text": "`resources/js/components/rsu/ManageAwardsPage.tsx` declares `POST /api/rsu` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c24bb440d5c14ca7", "name": "Unused endpoint: POST /api/rsu/backfill-vest-prices", "shortDescription": {"text": "Unused endpoint: POST /api/rsu/backfill-vest-prices"}, "fullDescription": {"text": "`resources/js/components/rsu/ManageAwardsPage.tsx` declares `POST /api/rsu/backfill-vest-prices` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec2efbd00d9d8f04", "name": "Unused endpoint: GET /api/phr/patients", "shortDescription": {"text": "Unused endpoint: GET /api/phr/patients"}, "fullDescription": {"text": "`resources/js/components/phr/PhrNavbar.tsx` declares `GET /api/phr/patients` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24578"}, "properties": {"repository": "bherila/2025-website", "repoUrl": "https://github.com/bherila/2025-website", "branch": "main"}, "results": [{"ruleId": "scanner-32c08b6b897fa89b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 resources/js/finance/8582/form8582.ts:39"}, "properties": {"repobilityId": "e92f0d619327e7ff", "scanner": "scanner-primary", "fingerprint": "32c08b6b897fa89b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7aa8dd7ac996e48c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/finance/1116/F1116ReviewPanel.tsx:129"}, "properties": {"repobilityId": "d6109e374a71da67", "scanner": "scanner-primary", "fingerprint": "7aa8dd7ac996e48c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f551f8544b5a98fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/class-action-tracker/ClassActionTracker.tsx:1026"}, "properties": {"repobilityId": "d812ab4b5083e636", "scanner": "scanner-primary", "fingerprint": "f551f8544b5a98fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6bf4300a8c45089", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/LotReconciliationHealthWidget.tsx:125"}, "properties": {"repobilityId": "520f17f6301565eb", "scanner": "scanner-primary", "fingerprint": "f6bf4300a8c45089", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fb1a2b1ff99d6a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/Form8949Preview.tsx:533"}, "properties": {"repobilityId": "87b4c056ec6a591a", "scanner": "scanner-primary", "fingerprint": "4fb1a2b1ff99d6a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c4b80f7bb02a81d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/CapitalGainsReconciliationPanel.tsx:424"}, "properties": {"repobilityId": "e6160a28903e9bc6", "scanner": "scanner-primary", "fingerprint": "c4b80f7bb02a81d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-695e971f486d6278", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/ScheduleSEPreview.tsx:39"}, "properties": {"repobilityId": "8c87d643e2a84028", "scanner": "scanner-primary", "fingerprint": "695e971f486d6278", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b2cdc20f06776ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/SummaryClient.tsx:76"}, "properties": {"repobilityId": "cc7b1bb21469771d", "scanner": "scanner-primary", "fingerprint": "1b2cdc20f06776ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-920ec2bbbbd1279d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/K1MultiYearView.tsx:300"}, "properties": {"repobilityId": "8aeb70fed5f70f2b", "scanner": "scanner-primary", "fingerprint": "920ec2bbbbd1279d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7fbd1f004a6d5126", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/ShortDividendDetailModal.tsx:96"}, "properties": {"repobilityId": "499982468368a9f8", "scanner": "scanner-primary", "fingerprint": "7fbd1f004a6d5126", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6307e60b9cf6e809", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/TaxDocumentReviewModal.tsx:538"}, "properties": {"repobilityId": "af5dce2dc6c7b571", "scanner": "scanner-primary", "fingerprint": "6307e60b9cf6e809", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40d7a06f93dc6144", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/K1AllInOneView.tsx:602"}, "properties": {"repobilityId": "ae846eaaf1e4e275", "scanner": "scanner-primary", "fingerprint": "40d7a06f93dc6144", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80856037b1002e4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/K3AllInOneView.tsx:621"}, "properties": {"repobilityId": "e92120afd2adf74e", "scanner": "scanner-primary", "fingerprint": "80856037b1002e4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e3b3cf6791e883a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/TaxLotReconciliationPanel.tsx:258"}, "properties": {"repobilityId": "3da13d9951677b1a", "scanner": "scanner-primary", "fingerprint": "2e3b3cf6791e883a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84da3ac94e9d8f62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/SourceValueOverridesView.tsx:340"}, "properties": {"repobilityId": "a7a85654f8621824", "scanner": "scanner-primary", "fingerprint": "84da3ac94e9d8f62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90b66c4f41210b3e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/Form1116Preview.tsx:382"}, "properties": {"repobilityId": "d4a2d0d536f82aa8", "scanner": "scanner-primary", "fingerprint": "90b66c4f41210b3e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fb330d884a27b30a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/FinanceHomePage.tsx:183"}, "properties": {"repobilityId": "988609f03efe8f66", "scanner": "scanner-primary", "fingerprint": "fb330d884a27b30a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03a8ff43beb23eb0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/ManageTagsPage.tsx:154"}, "properties": {"repobilityId": "d9ec301509968290", "scanner": "scanner-primary", "fingerprint": "03a8ff43beb23eb0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8933d5af12fca5b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/statements/StatementPdfModal.tsx:30"}, "properties": {"repobilityId": "6723d5b8f1ced9d6", "scanner": "scanner-primary", "fingerprint": "f8933d5af12fca5b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80ab2a555bec40a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/rules_engine/RuleRow.tsx:27"}, "properties": {"repobilityId": "5271e626dc7d445f", "scanner": "scanner-primary", "fingerprint": "80ab2a555bec40a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60be734611bba7da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/lots/shared/LotWorkspaceTable.tsx:89"}, "properties": {"repobilityId": "c9783d6e6ed639b5", "scanner": "scanner-primary", "fingerprint": "60be734611bba7da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-376121145c8968b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/k1/K1ReviewPanel.tsx:182"}, "properties": {"repobilityId": "a92618e99c229b7f", "scanner": "scanner-primary", "fingerprint": "376121145c8968b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5453c9f8c4ff3a4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/import_transactions/GenAiJobsList.tsx:167"}, "properties": {"repobilityId": "adbb52e54b12c347", "scanner": "scanner-primary", "fingerprint": "5453c9f8c4ff3a4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64b3bf00b8caa144", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/tax-preview/ReadinessCards.tsx:275"}, "properties": {"repobilityId": "91b3df1b2d146e56", "scanner": "scanner-primary", "fingerprint": "64b3bf00b8caa144", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6db59e86c240ecb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/accounts/MissingAccountResolver.tsx:344"}, "properties": {"repobilityId": "7855bbe7919bf620", "scanner": "scanner-primary", "fingerprint": "a6db59e86c240ecb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c80dced9b3a4234", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/TaxFacet.tsx:108"}, "properties": {"repobilityId": "ad6d2b06d54aade1", "scanner": "scanner-primary", "fingerprint": "3c80dced9b3a4234", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d55dcb5316cf5677", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/StatementFacet.tsx:61"}, "properties": {"repobilityId": "0dabf5eaf3f02cdd", "scanner": "scanner-primary", "fingerprint": "d55dcb5316cf5677", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-77da6041cd2eba8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/DocumentsTable.tsx:97"}, "properties": {"repobilityId": "3920b15bc1a077a3", "scanner": "scanner-primary", "fingerprint": "77da6041cd2eba8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-094419a3cf10f8a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/finance/documents/DocumentDetailDrawer.tsx:108"}, "properties": {"repobilityId": "9e05b6f5ed1f6062", "scanner": "scanner-primary", "fingerprint": "094419a3cf10f8a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c9a6c5a274d9e5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/payslip/PayslipImportJobCard.tsx:286"}, "properties": {"repobilityId": "5232657f3d497567", "scanner": "scanner-primary", "fingerprint": "3c9a6c5a274d9e5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca2520e69da73b02", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/payslip/PayslipDetailClient.tsx:284"}, "properties": {"repobilityId": "b2b971482fdd0f28", "scanner": "scanner-primary", "fingerprint": "ca2520e69da73b02", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca8585564d84425f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/payslip/PayslipImportModal.tsx:237"}, "properties": {"repobilityId": "98ece08a09e78f4d", "scanner": "scanner-primary", "fingerprint": "ca8585564d84425f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6881947a3d49dc0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/rsu/RsuImportModal.tsx:179"}, "properties": {"repobilityId": "dc780746d3e0a1a9", "scanner": "scanner-primary", "fingerprint": "f6881947a3d49dc0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7838a7f8d6d29c53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/rsu/RsuImportJobCard.tsx:194"}, "properties": {"repobilityId": "7dcd9ce11c5cb621", "scanner": "scanner-primary", "fingerprint": "7838a7f8d6d29c53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f7e8acaea244869a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 resources/js/components/markdown/sanitizeSvg.ts:2"}, "properties": {"repobilityId": "12faf85688d3bcab", "scanner": "scanner-primary", "fingerprint": "f7e8acaea244869a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b3b0e24318bf66be", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 resources/js/components/markdown/MermaidBlock.tsx:98"}, "properties": {"repobilityId": "974467df8808048e", "scanner": "scanner-primary", "fingerprint": "b3b0e24318bf66be", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-38141d0aba6b5c04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/utility-bill-tracker/EditBillModal.tsx:421"}, "properties": {"repobilityId": "09a09c59fe7cb233", "scanner": "scanner-primary", "fingerprint": "38141d0aba6b5c04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb5da1a1710b33c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/utility-bill-tracker/UtilityBillJobCard.tsx:189"}, "properties": {"repobilityId": "e1b58f4d9eba619a", "scanner": "scanner-primary", "fingerprint": "bb5da1a1710b33c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-426d7c6bdae2f3a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/utility-bill-tracker/ImportBillModal.tsx:161"}, "properties": {"repobilityId": "e92181be11d724f8", "scanner": "scanner-primary", "fingerprint": "426d7c6bdae2f3a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-739bc20389d9b371", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/planning/CareerComp/CareerCompForm.tsx:648"}, "properties": {"repobilityId": "6320893d33873c65", "scanner": "scanner-primary", "fingerprint": "739bc20389d9b371", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-670e6e093cbbc9f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/planning/RothConversion/RothConversionForm.tsx:251"}, "properties": {"repobilityId": "d648cbfeeefe3cdf", "scanner": "scanner-primary", "fingerprint": "670e6e093cbbc9f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68520b86067b9a2a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/planning/RothConversion/RothConversionPage.tsx:398"}, "properties": {"repobilityId": "73a276581b14c6d2", "scanner": "scanner-primary", "fingerprint": "68520b86067b9a2a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1cdfa0abb4db21cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/ui/miller/MillerColumnShell.tsx:164"}, "properties": {"repobilityId": "eb480925631f7751", "scanner": "scanner-primary", "fingerprint": "1cdfa0abb4db21cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8aac2ca0ecaf7402", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/components/ui/miller/MillerDockHome.tsx:139"}, "properties": {"repobilityId": "5a297ea3731b04bd", "scanner": "scanner-primary", "fingerprint": "8aac2ca0ecaf7402", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ade3b2c41692a497", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/access/AccessPage.tsx:178"}, "properties": {"repobilityId": "a120d2f00184f129", "scanner": "scanner-primary", "fingerprint": "ade3b2c41692a497", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8107c5beada4783", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/summary/SummaryPage.tsx:258"}, "properties": {"repobilityId": "a6f33e59c9aeab5b", "scanner": "scanner-primary", "fingerprint": "f8107c5beada4783", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5f6ae69de22d3a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/imaging/ImagingPage.tsx:331"}, "properties": {"repobilityId": "c56c2b62fd758901", "scanner": "scanner-primary", "fingerprint": "d5f6ae69de22d3a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7dbcbfacb18cee11", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/imaging/ImagingStudyDetail.tsx:130"}, "properties": {"repobilityId": "d58f889720f601c8", "scanner": "scanner-primary", "fingerprint": "7dbcbfacb18cee11", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a528b7d36f5eed8a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/patients/PatientList.tsx:33"}, "properties": {"repobilityId": "dd3cdade9fd6306f", "scanner": "scanner-primary", "fingerprint": "a528b7d36f5eed8a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e111dd0e6fca8ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/phr/documents/DocumentsPage.tsx:406"}, "properties": {"repobilityId": "c372e0707ad8efd9", "scanner": "scanner-primary", "fingerprint": "9e111dd0e6fca8ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb76f6ef8f4b7ae4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:238"}, "properties": {"repobilityId": "4693371e16174b92", "scanner": "scanner-primary", "fingerprint": "cb76f6ef8f4b7ae4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49edd70fc7c36a19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 resources/js/client-management/components/portal/ProjectPageHeader.tsx:116"}, "properties": {"repobilityId": "348cbf7326598291", "scanner": "scanner-primary", "fingerprint": "49edd70fc7c36a19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b0520da0b5988fa", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/devcontainers/php:8.5-bookworm"}, "properties": {"repobilityId": "e5d23375b0b955e9", "scanner": "scanner-primary", "fingerprint": "4b0520da0b5988fa", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".devcontainer/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-3c5c533aa0862623", "level": "error", "message": {"text": "Runtime dotenv file present in repo: .env.testing"}, "properties": {"repobilityId": "d64ee5696e603c0d", "scanner": "scanner-primary", "fingerprint": "3c5c533aa0862623", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".env.testing"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bb6268d77140ac23", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tests-ts/login-audit-section.test.tsx:53"}, "properties": {"repobilityId": "68d711059361e186", "scanner": "scanner-primary", "fingerprint": "bb6268d77140ac23", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tests-ts/login-audit-section.test.tsx"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-a3c68fe1202fc90e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tests-ts/AgentAccessCard.test.tsx:22"}, "properties": {"repobilityId": "844cc20c8d843942", "scanner": "scanner-primary", "fingerprint": "a3c68fe1202fc90e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tests-ts/AgentAccessCard.test.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-70d95712cc3d6ac5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/finance/__tests__/TransactionDetailsModal.test.tsx:69"}, "properties": {"repobilityId": "a62d95e284e9b47e", "scanner": "scanner-primary", "fingerprint": "70d95712cc3d6ac5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/finance/__tests__/TransactionDetailsModal.test.tsx"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-0966618d3bc0ae8e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in resources/js/components/markdown/MermaidBlock.tsx:98"}, "properties": {"repobilityId": "fd04a9bf9e0c0ac2", "scanner": "scanner-primary", "fingerprint": "0966618d3bc0ae8e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/markdown/MermaidBlock.tsx"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-8ad0bc50b79ffc68", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/TimeEntryListItem.invoice.test.tsx:40"}, "properties": {"repobilityId": "e15e96b73d30cf29", "scanner": "scanner-primary", "fingerprint": "8ad0bc50b79ffc68", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/client-management/components/portal/__tests__/TimeEntryListItem.invoice.test.tsx"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-56d13c7f8d74a688", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/NewTimeEntryModal.deferred.test.tsx:41"}, "properties": {"repobilityId": "1848d01343f51e5b", "scanner": "scanner-primary", "fingerprint": "56d13c7f8d74a688", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/client-management/components/portal/__tests__/NewTimeEntryModal.deferred.test.tsx"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-0807b01cfb2aea79", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/NewTimeEntryModal.test.tsx:12"}, "properties": {"repobilityId": "6babc3500e255ac6", "scanner": "scanner-primary", "fingerprint": "0807b01cfb2aea79", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/client-management/components/portal/__tests__/NewTimeEntryModal.test.tsx"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-41f2c245d1013ad1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/ClientPortalNav.test.tsx:38"}, "properties": {"repobilityId": "b88bc52de179f4b0", "scanner": "scanner-primary", "fingerprint": "41f2c245d1013ad1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/client-management/components/portal/__tests__/ClientPortalNav.test.tsx"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-a75e1033dd8a98fc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/TimeEntryListItem.deferred.test.tsx:40"}, "properties": {"repobilityId": "7823999a63e8cc99", "scanner": "scanner-primary", "fingerprint": "a75e1033dd8a98fc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/client-management/components/portal/__tests__/TimeEntryListItem.deferred.test.tsx"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-df91c7ebed007ab4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/components/portal/__tests__/hydration.test.tsx:17"}, "properties": {"repobilityId": "ce240f045577a1f7", "scanner": "scanner-primary", "fingerprint": "df91c7ebed007ab4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/client-management/components/portal/__tests__/hydration.test.tsx"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-fadd8d7d28f523ec", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/client-management/__tests__/portal-hydration.test.tsx:14"}, "properties": {"repobilityId": "13831d2e0f155735", "scanner": "scanner-primary", "fingerprint": "fadd8d7d28f523ec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/client-management/__tests__/portal-hydration.test.tsx"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-2e9ab266fdf52e52", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/lib/__tests__/numberInputWheelGuard.dom.test.ts:18"}, "properties": {"repobilityId": "c1e44a81a84dfacf", "scanner": "scanner-primary", "fingerprint": "2e9ab266fdf52e52", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/lib/__tests__/numberInputWheelGuard.dom.test.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-39da2fd8d72ea4fa", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8b83b18e526da2e0", "scanner": "scanner-primary", "fingerprint": "39da2fd8d72ea4fa", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/parking-pickup-playwright.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-39da2fd8d72ea4fa", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "920a43d7a7e4ea17", "scanner": "scanner-primary", "fingerprint": "39da2fd8d72ea4fa", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/parking-pickup-playwright.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-39da2fd8d72ea4fa", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f7f2073545f00e00", "scanner": "scanner-primary", "fingerprint": "39da2fd8d72ea4fa", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/parking-pickup-playwright.yml"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-39da2fd8d72ea4fa", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b3e53b9e1045a7a4", "scanner": "scanner-primary", "fingerprint": "39da2fd8d72ea4fa", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/parking-pickup-playwright.yml"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-39da2fd8d72ea4fa", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2a4c55c9917ab559", "scanner": "scanner-primary", "fingerprint": "39da2fd8d72ea4fa", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/parking-pickup-playwright.yml"}, "region": {"startLine": 110}}}]}, {"ruleId": "scanner-ebcbaef3e3637e74", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d8a77dcd4b375202", "scanner": "scanner-primary", "fingerprint": "ebcbaef3e3637e74", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ohif-dist.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-ebcbaef3e3637e74", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d8a77dcd4b375202", "scanner": "scanner-primary", "fingerprint": "ebcbaef3e3637e74", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ohif-dist.yml"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-ebcbaef3e3637e74", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7264b6620b63ef7b", "scanner": "scanner-primary", "fingerprint": "ebcbaef3e3637e74", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ohif-dist.yml"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-ebcbaef3e3637e74", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fd24ee5c034aa68a", "scanner": "scanner-primary", "fingerprint": "ebcbaef3e3637e74", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ohif-dist.yml"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-ebcbaef3e3637e74", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4620b0ebd6b03a9b", "scanner": "scanner-primary", "fingerprint": "ebcbaef3e3637e74", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ohif-dist.yml"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-3fa7d323bfc461ed", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a9c6da25062d26f2", "scanner": "scanner-primary", "fingerprint": "3fa7d323bfc461ed", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/copilot-setup-steps.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-3fa7d323bfc461ed", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6c80cd0fc52498eb", "scanner": "scanner-primary", "fingerprint": "3fa7d323bfc461ed", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/copilot-setup-steps.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-3fa7d323bfc461ed", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9da121f8f9164341", "scanner": "scanner-primary", "fingerprint": "3fa7d323bfc461ed", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/copilot-setup-steps.yml"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-3fa7d323bfc461ed", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "90dd51d2a7fb9cd5", "scanner": "scanner-primary", "fingerprint": "3fa7d323bfc461ed", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/copilot-setup-steps.yml"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-4fc1674942b750d5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f647c49d795526a9", "scanner": "scanner-primary", "fingerprint": "4fc1674942b750d5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/slow-tests.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bf7cf64f3232f105", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b26ce68c37b84c6f", "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": 123}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9df8e08a95a059d9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 218}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a22664b58dca3181", "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": 223}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a22664b58dca3181", "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": 236}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4e294813f891987c", "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": 262}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9df8e08a95a059d9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 268}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a22664b58dca3181", "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": 273}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9df8e08a95a059d9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 379}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a22664b58dca3181", "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": 384}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4e294813f891987c", "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": 394}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "17adda459f780ae6", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0948f4f8240ce3c1", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8d5e537c535423bb", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7671fa74edf42f6a", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-b790b5dff379733e", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "725b831c17f1e174", "scanner": "scanner-primary", "fingerprint": "b790b5dff379733e", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e-tests.yml"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-0d8137eb75b00a05", "level": "note", "message": {"text": "Very large file: tests-ts/washSaleEngine.test.ts (1188 lines)"}, "properties": {"repobilityId": "14a880b8876d7b1b", "scanner": "scanner-primary", "fingerprint": "0d8137eb75b00a05", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f7c86286a1c8c722", "level": "note", "message": {"text": "Very large file: resources/js/games/cars/gameEngine.ts (2145 lines)"}, "properties": {"repobilityId": "26ff06dfcdccdff3", "scanner": "scanner-primary", "fingerprint": "f7c86286a1c8c722", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ca3ebf7423a1e889", "level": "note", "message": {"text": "Very large file: resources/js/components/class-action-tracker/ClassActionTracker.tsx (1632 lines)"}, "properties": {"repobilityId": "bec100788ce15932", "scanner": "scanner-primary", "fingerprint": "ca3ebf7423a1e889", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-04bf972cd46d0a31", "level": "note", "message": {"text": "Very large file: resources/js/components/finance/TaxDocumentReviewModal.tsx (1583 lines)"}, "properties": {"repobilityId": "cd7e321ad3ae7e61", "scanner": "scanner-primary", "fingerprint": "04bf972cd46d0a31", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-047aeb3553e17dd2", "level": "note", "message": {"text": "Very large file: resources/js/components/finance/k1/K1ReviewPanel.tsx (2063 lines)"}, "properties": {"repobilityId": "26620c8ad786ae06", "scanner": "scanner-primary", "fingerprint": "047aeb3553e17dd2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-05e1cdd51c3608d1", "level": "note", "message": {"text": "Very large file: resources/js/components/finance/tax-preview/registry.tsx (1458 lines)"}, "properties": {"repobilityId": "624a38e9ceb85603", "scanner": "scanner-primary", "fingerprint": "05e1cdd51c3608d1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-99d5c6df84d43ed4", "level": "note", "message": {"text": "Very large file: resources/js/components/planning/CareerComp/CareerCompForm.tsx (1967 lines)"}, "properties": {"repobilityId": "ec9226ae72d8938d", "scanner": "scanner-primary", "fingerprint": "99d5c6df84d43ed4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "615c119b7c7d084c", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "68c593f9eadaae40", "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": "2abdace014dc3492", "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": "d2457791abeca1c9", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "6320f28edc08b82a", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2679282aa1c484b5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "properties": {"repobilityId": "27d579812e6be614", "scanner": "scanner-primary", "fingerprint": "2679282aa1c484b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "AGENTS.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b1d2ebb3fe2036f3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: GEMINI.md"}, "properties": {"repobilityId": "aed665d000b9a23e", "scanner": "scanner-primary", "fingerprint": "b1d2ebb3fe2036f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "gemini_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "GEMINI.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aef9872ebbd2b160", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .github/copilot-instructions.md"}, "properties": {"repobilityId": "0f079956bea4eb94", "scanner": "scanner-primary", "fingerprint": "aef9872ebbd2b160", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agent_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/copilot-instructions.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-210a4ececb634f79", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/finance-mcp.md"}, "properties": {"repobilityId": "4739319c94eedc0e", "scanner": "scanner-primary", "fingerprint": "210a4ececb634f79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/finance-mcp.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6fb6e45b05b230ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests-ts/washSaleEngine.test.ts:728"}, "properties": {"repobilityId": "eeb503c750a7fe4a", "scanner": "scanner-primary", "fingerprint": "6fb6e45b05b230ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea689fa64198766f", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests-ts/TaxPreviewContext.test.ts:14"}, "properties": {"repobilityId": "d68a7fdbf7c8e6ca", "scanner": "scanner-primary", "fingerprint": "ea689fa64198766f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eab33e6946fdeb21", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/fetchWrapper.ts:25"}, "properties": {"repobilityId": "44fd5688586160ea", "scanner": "scanner-primary", "fingerprint": "eab33e6946fdeb21", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d2cead9067958432", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/genai-processor/useGenAiFileUpload.ts:61"}, "properties": {"repobilityId": "8d0e7ce3b6af3180", "scanner": "scanner-primary", "fingerprint": "d2cead9067958432", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f8af1900701f96f2", "level": "none", "message": {"text": "Commented-code block (5 lines) in resources/js/games/marble-sort/MarbleSortScene.tsx:205"}, "properties": {"repobilityId": "32a3b3f2a5f04b44", "scanner": "scanner-primary", "fingerprint": "f8af1900701f96f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a869c8baa5b7179", "level": "none", "message": {"text": "Commented-code block (7 lines) in resources/js/games/marble-sort/gameEngine.ts:208"}, "properties": {"repobilityId": "a2e3e23f498bd80f", "scanner": "scanner-primary", "fingerprint": "1a869c8baa5b7179", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-397f0a2bb84aa924", "level": "none", "message": {"text": "Commented-code block (6 lines) in resources/js/games/marble-sort/scene/sceneConstants.ts:32"}, "properties": {"repobilityId": "238f4bd0b5e39737", "scanner": "scanner-primary", "fingerprint": "397f0a2bb84aa924", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a00a426ead6dd03", "level": "none", "message": {"text": "Commented-code block (5 lines) in resources/js/games/marble-sort/scene/physics/world.ts:113"}, "properties": {"repobilityId": "46f2cf52cc47f97f", "scanner": "scanner-primary", "fingerprint": "1a00a426ead6dd03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4620c1e2daa0486", "level": "none", "message": {"text": "Commented-code block (5 lines) in resources/js/games/cars/CarsScene.tsx:630"}, "properties": {"repobilityId": "22232cc00c903892", "scanner": "scanner-primary", "fingerprint": "a4620c1e2daa0486", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-475a31b1bf0c981d", "level": "none", "message": {"text": "Commented-code block (6 lines) in resources/js/games/cars/scene/passengerLoopSlots.ts:63"}, "properties": {"repobilityId": "08dec888eb89792f", "scanner": "scanner-primary", "fingerprint": "475a31b1bf0c981d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bbc77871ebd15d84", "level": "none", "message": {"text": "Commented-code block (5 lines) in resources/js/types/finance/tax-return-k1.ts:174"}, "properties": {"repobilityId": "18ab9f4249b66c3a", "scanner": "scanner-primary", "fingerprint": "bbc77871ebd15d84", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68357ec8488c9d06", "level": "note", "message": {"text": "Legacy-named symbol `notification_email_copy` in resources/js/components/class-action-tracker/ClassActionTracker.tsx:87"}, "properties": {"repobilityId": "02ad8d764e82b486", "scanner": "scanner-primary", "fingerprint": "68357ec8488c9d06", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-64d131209c1a2156", "level": "note", "message": {"text": "Legacy-named symbol `notification_email_copy` in resources/js/components/class-action-tracker/__tests__/ClassActionTracker.test.tsx:52"}, "properties": {"repobilityId": "91ebe75b112d9075", "scanner": "scanner-primary", "fingerprint": "64d131209c1a2156", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4e3c0a841f80e8c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/components/finance/FinanceAccountsPage.tsx:36"}, "properties": {"repobilityId": "87fb37dc75ea9361", "scanner": "scanner-primary", "fingerprint": "4e3c0a841f80e8c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3976a18eb56876b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in resources/js/components/finance/__tests__/Form8949Preview.test.tsx:147"}, "properties": {"repobilityId": "34c8226d2d483519", "scanner": "scanner-primary", "fingerprint": "3976a18eb56876b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1f64ee78e4e9d3d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/components/shared/FileManager.tsx:447"}, "properties": {"repobilityId": "30675259138c1c66", "scanner": "scanner-primary", "fingerprint": "b1f64ee78e4e9d3d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ace455b2f032023f", "level": "none", "message": {"text": "Commented-code block (6 lines) in resources/js/components/markdown/__tests__/Preview.test.tsx:187"}, "properties": {"repobilityId": "9ffa9fa4f60dfcee", "scanner": "scanner-primary", "fingerprint": "ace455b2f032023f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86bd24c00db4fe52", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/components/utility-bill-tracker/EditBillModal.tsx:132"}, "properties": {"repobilityId": "28695e0477bfb457", "scanner": "scanner-primary", "fingerprint": "86bd24c00db4fe52", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff234ea91fbc4d48", "level": "note", "message": {"text": "Legacy-named symbol `withoutLegacy` in resources/js/components/planning/CareerComp/inputUtils.ts:33"}, "properties": {"repobilityId": "74b4d00355a2d7b3", "scanner": "scanner-primary", "fingerprint": "ff234ea91fbc4d48", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c839370f5cf1502a", "level": "none", "message": {"text": "Commented-code block (7 lines) in resources/js/components/planning/CareerComp/CareerCompForm.tsx:344"}, "properties": {"repobilityId": "fb2037187da11b86", "scanner": "scanner-primary", "fingerprint": "c839370f5cf1502a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee65f3dad7e05879", "level": "note", "message": {"text": "Legacy-named symbol `next_month_starting_unused` in resources/js/client-management/types/time-entry.ts:57"}, "properties": {"repobilityId": "22e3a49e7bce64aa", "scanner": "scanner-primary", "fingerprint": "ee65f3dad7e05879", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f25b23a585a973d3", "level": "note", "message": {"text": "Legacy-named symbol `next_month_starting_unused` in resources/js/client-management/components/portal/ClientPortalTimePage.tsx:314"}, "properties": {"repobilityId": "e21ac12342ee9610", "scanner": "scanner-primary", "fingerprint": "f25b23a585a973d3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5c5d32d0693439d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/client-management/components/portal/NewTimeEntryModal.tsx:154"}, "properties": {"repobilityId": "29c11462ebbe4c38", "scanner": "scanner-primary", "fingerprint": "5c5d32d0693439d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e5ff37bed4dde92c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/client-management/__tests__/portal-hydration.test.tsx:132"}, "properties": {"repobilityId": "e789385efef29c06", "scanner": "scanner-primary", "fingerprint": "e5ff37bed4dde92c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c83e53b6b2c33ac2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 resources/js/lib/api.ts:6"}, "properties": {"repobilityId": "7e8ce7efa60ed7e8", "scanner": "scanner-primary", "fingerprint": "c83e53b6b2c33ac2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0535e7cb5db1721", "level": "none", "message": {"text": "Commented-code block (9 lines) in resources/js/lib/finance/__tests__/k1Utils.test.ts:346"}, "properties": {"repobilityId": "3834383d0ed50c53", "scanner": "scanner-primary", "fingerprint": "a0535e7cb5db1721", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d05fb818d8431384", "level": "none", "message": {"text": "Commented-code block (6 lines) in resources/js/lib/finance/__tests__/form8949Extraction.test.ts:143"}, "properties": {"repobilityId": "1a3d29ef60e9d98e", "scanner": "scanner-primary", "fingerprint": "d05fb818d8431384", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea06e259920617d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in resources/js/lib/planning/__tests__/solo401k.test.ts:128"}, "properties": {"repobilityId": "504df3e223dea4a8", "scanner": "scanner-primary", "fingerprint": "ea06e259920617d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3482f7e5dd70cd1a", "level": "note", "message": {"text": "6 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "1da70f25aa46f6e9", "scanner": "scanner-primary", "fingerprint": "3482f7e5dd70cd1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-13dcf9193ea45ce6", "level": "error", "message": {"text": "JS POST `/api/admin/tax-normalization-review/acknowledge` admin endpoint without auth \u2014 resources/js/components/admin/AdminTaxNormalizationPage.tsx:112"}, "properties": {"repobilityId": "90b26d65e6f4bc52", "scanner": "scanner-primary", "fingerprint": "13dcf9193ea45ce6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/admin/AdminTaxNormalizationPage.tsx"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-731f305a0cbf2a3a", "level": "error", "message": {"text": "JS POST `/api/admin/genai-jobs/${job.id}/requeue` admin endpoint without auth \u2014 resources/js/components/admin/AdminGenAiJobsPage.tsx:109"}, "properties": {"repobilityId": "7683e4a4809ad9fd", "scanner": "scanner-primary", "fingerprint": "731f305a0cbf2a3a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/admin/AdminGenAiJobsPage.tsx"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-470a81f3996a2f34", "level": "error", "message": {"text": "JS POST `/api/admin/users` admin endpoint without auth \u2014 resources/js/components/user-management/CreateUserModal.tsx:50"}, "properties": {"repobilityId": "3488c81f1860ab8f", "scanner": "scanner-primary", "fingerprint": "470a81f3996a2f34", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/user-management/CreateUserModal.tsx"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-602020d60f7cf60a", "level": "error", "message": {"text": "JS POST `/api/admin/users/${user.id}/email` admin endpoint without auth \u2014 resources/js/components/user-management/UserActionsModal.tsx:109"}, "properties": {"repobilityId": "21ffff1bb5de5c8d", "scanner": "scanner-primary", "fingerprint": "602020d60f7cf60a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/user-management/UserActionsModal.tsx"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-f6f09c59e99b6297", "level": "error", "message": {"text": "JS POST `/api/admin/users/${user.id}/login-as` admin endpoint without auth \u2014 resources/js/components/user-management/UserActionsModal.tsx:193"}, "properties": {"repobilityId": "bec89c9f8be8ba9a", "scanner": "scanner-primary", "fingerprint": "f6f09c59e99b6297", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/user-management/UserActionsModal.tsx"}, "region": {"startLine": 193}}}]}, {"ruleId": "scanner-7b82c0028c57cec0", "level": "error", "message": {"text": "Dangling fetch: GET /api/user (resources/js/dashboard.tsx:34)"}, "properties": {"repobilityId": "027dbdabbc7e2e9f", "scanner": "scanner-primary", "fingerprint": "7b82c0028c57cec0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-17febb8ffc4c5dc5", "level": "error", "message": {"text": "Dangling fetch: POST /api/user/update-api-key (resources/js/user/api-key.tsx:54)"}, "properties": {"repobilityId": "37f93d6fef1aa31b", "scanner": "scanner-primary", "fingerprint": "17febb8ffc4c5dc5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-78a66c6f61c92546", "level": "error", "message": {"text": "Dangling fetch: POST /api/user/update-password (resources/js/user/update-password.tsx:28)"}, "properties": {"repobilityId": "b45a457c57d4484f", "scanner": "scanner-primary", "fingerprint": "78a66c6f61c92546", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-651220625cb68980", "level": "error", "message": {"text": "Dangling fetch: GET /api/login-audit?page=${p} (resources/js/user/login-audit-section.tsx:44)"}, "properties": {"repobilityId": "9c30858fc186662e", "scanner": "scanner-primary", "fingerprint": "651220625cb68980", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-43d064a78feda089", "level": "error", "message": {"text": "Dangling fetch: POST /api/login-audit/${id}/suspicious (resources/js/user/login-audit-section.tsx:66)"}, "properties": {"repobilityId": "bd40c126e0ad7e8a", "scanner": "scanner-primary", "fingerprint": "43d064a78feda089", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5f6811f442d20783", "level": "error", "message": {"text": "Dangling fetch: POST /api/user/update-email (resources/js/user/update-email.tsx:24)"}, "properties": {"repobilityId": "5e30f6e0300b0dc1", "scanner": "scanner-primary", "fingerprint": "5f6811f442d20783", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c02903343855940a", "level": "error", "message": {"text": "Dangling fetch: POST /api/user/update-genai-quota (resources/js/user/genai-quota.tsx:33)"}, "properties": {"repobilityId": "2aefbc978ce46fb0", "scanner": "scanner-primary", "fingerprint": "c02903343855940a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-88d05a0c30696ce8", "level": "error", "message": {"text": "Dangling fetch: GET /api/finance/chart (resources/js/components/finance/FinanceAccountsPage.tsx:55)"}, "properties": {"repobilityId": "33692ce4f4160936", "scanner": "scanner-primary", "fingerprint": "88d05a0c30696ce8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a77f8b8ac4da53b", "level": "error", "message": {"text": "Dangling fetch: POST /api/finance/accounts/balance (resources/js/components/finance/EditBalanceDisplay.tsx:29)"}, "properties": {"repobilityId": "3851c6b23ead1a11", "scanner": "scanner-primary", "fingerprint": "8a77f8b8ac4da53b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fc5a5666548e480d", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/genai/import/jobs/${deleteJobId} (resources/js/components/finance/import_transactions/GenAiJobsList.tsx:86)"}, "properties": {"repobilityId": "0005db03664616b0", "scanner": "scanner-primary", "fingerprint": "fc5a5666548e480d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5494edb4ca51f17b", "level": "error", "message": {"text": "Dangling fetch: GET /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/linkable (resources/js/components/utility-bill-tracker/LinkBillModal.tsx:34)"}, "properties": {"repobilityId": "ecd1338e6921e4c2", "scanner": "scanner-primary", "fingerprint": "5494edb4ca51f17b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3ba2207911f933c7", "level": "error", "message": {"text": "Dangling fetch: POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/link (resources/js/components/utility-bill-tracker/LinkBillModal.tsx:62)"}, "properties": {"repobilityId": "ccdd0993d2621a1d", "scanner": "scanner-primary", "fingerprint": "3ba2207911f933c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d1aca6f7ee731196", "level": "error", "message": {"text": "Dangling fetch: POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/unlink (resources/js/components/utility-bill-tracker/LinkBillModal.tsx:89)"}, "properties": {"repobilityId": "9355ae0bb0c66aac", "scanner": "scanner-primary", "fingerprint": "d1aca6f7ee731196", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7603bcb351f5d2bb", "level": "error", "message": {"text": "Dangling fetch: GET /api/utility-bill-tracker/accounts/${accountId} (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:51)"}, "properties": {"repobilityId": "818ca1287a08642f", "scanner": "scanner-primary", "fingerprint": "7603bcb351f5d2bb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f445bf9e906be87d", "level": "error", "message": {"text": "Dangling fetch: GET /api/utility-bill-tracker/accounts/${accountId}/bills (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:52)"}, "properties": {"repobilityId": "16238f5262c6a970", "scanner": "scanner-primary", "fingerprint": "f445bf9e906be87d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1741a5775f0b18c", "level": "error", "message": {"text": "Dangling fetch: PUT /api/utility-bill-tracker/accounts/${accountId}/notes (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:84)"}, "properties": {"repobilityId": "957c4d6b23149dbc", "scanner": "scanner-primary", "fingerprint": "a1741a5775f0b18c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c8efe4b08197a3e5", "level": "error", "message": {"text": "Dangling fetch: POST /api/utility-bill-tracker/accounts/${accountId}/bills/${bill.id}/toggle-status (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:132)"}, "properties": {"repobilityId": "5eb21b36c3af08ba", "scanner": "scanner-primary", "fingerprint": "c8efe4b08197a3e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-95fea07a768a28cf", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/utility-bill-tracker/accounts/${accountId}/bills/${selectedBill.id} (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:166)"}, "properties": {"repobilityId": "a549a66c417e6b3d", "scanner": "scanner-primary", "fingerprint": "95fea07a768a28cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da46d0d13538bb93", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/utility-bill-tracker/accounts/${accountId} (resources/js/components/utility-bill-tracker/UtilityBillListPage.tsx:187)"}, "properties": {"repobilityId": "9ab29432610bf494", "scanner": "scanner-primary", "fingerprint": "da46d0d13538bb93", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-af075de28224413c", "level": "error", "message": {"text": "Dangling fetch: POST /api/utility-bill-tracker/accounts (resources/js/components/utility-bill-tracker/CreateAccountModal.tsx:28)"}, "properties": {"repobilityId": "16cf9b3f4dea0246", "scanner": "scanner-primary", "fingerprint": "af075de28224413c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-46d954ff8566bb38", "level": "error", "message": {"text": "Dangling fetch: GET /api/utility-bill-tracker/accounts (resources/js/components/utility-bill-tracker/UtilityAccountListPage.tsx:23)"}, "properties": {"repobilityId": "d3623fbdf12e71c8", "scanner": "scanner-primary", "fingerprint": "46d954ff8566bb38", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5dd21e43468b2071", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/utility-bill-tracker/accounts/${accountId}/bills/${currentBill.id}/pdf (resources/js/components/utility-bill-tracker/EditBillModal.tsx:164)"}, "properties": {"repobilityId": "57dd603efb322435", "scanner": "scanner-primary", "fingerprint": "5dd21e43468b2071", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-29ec2880781d241b", "level": "error", "message": {"text": "Dangling fetch: POST /client/mgmt (resources/js/client-management/components/ClientManagementCreatePage.tsx:21)"}, "properties": {"repobilityId": "d309dcb97aa35985", "scanner": "scanner-primary", "fingerprint": "29ec2880781d241b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1d3d94cc71900c64", "level": "error", "message": {"text": "Dangling fetch: POST /api/client/mgmt/companies/${companyId}/invoices/generate-all (resources/js/client-management/components/ClientAdminActions.tsx:37)"}, "properties": {"repobilityId": "eb534e9767f50dbd", "scanner": "scanner-primary", "fingerprint": "1d3d94cc71900c64", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2c751e3bd9619afe", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/mgmt/companies/${companyId}/expenses (resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:73)"}, "properties": {"repobilityId": "4def59a041b53034", "scanner": "scanner-primary", "fingerprint": "2c751e3bd9619afe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2bc3b5499ee66227", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug}/projects (resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:87)"}, "properties": {"repobilityId": "3584cb4326705456", "scanner": "scanner-primary", "fingerprint": "2bc3b5499ee66227", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5d13ee995aa4010e", "level": "error", "message": {"text": "Dangling fetch: POST /api/client/mgmt/companies/${companyId}/expenses/${expense.id}/mark-reimbursed (resources/js/client-management/components/portal/ClientPortalExpensesPage.tsx:104)"}, "properties": {"repobilityId": "98117f2a9b6dbc3e", "scanner": "scanner-primary", "fingerprint": "5d13ee995aa4010e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-069deaa0604d0682", "level": "error", "message": {"text": "Dangling fetch: PUT /api/client/portal/${slug}/projects/${projectSlug} (resources/js/client-management/components/portal/ProjectPageHeader.tsx:44)"}, "properties": {"repobilityId": "3a2985f724ac13f4", "scanner": "scanner-primary", "fingerprint": "069deaa0604d0682", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d128c4ccb269800", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug}/projects/${projectSlug}/tasks (resources/js/client-management/components/portal/ClientPortalProjectPage.tsx:92)"}, "properties": {"repobilityId": "bfc04b88ba286482", "scanner": "scanner-primary", "fingerprint": "8d128c4ccb269800", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e67805a8312b2df", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug} (resources/js/client-management/components/portal/ClientPortalProjectPage.tsx:106)"}, "properties": {"repobilityId": "da5a9f5ffb1ce566", "scanner": "scanner-primary", "fingerprint": "6e67805a8312b2df", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab833e71336fc43d", "level": "error", "message": {"text": "Dangling fetch: PUT /api/client/portal/${slug}/projects/${projectSlug}/tasks/${task.id} (resources/js/client-management/components/portal/ClientPortalProjectPage.tsx:137)"}, "properties": {"repobilityId": "3ff7b8b242278d49", "scanner": "scanner-primary", "fingerprint": "ab833e71336fc43d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cb918aa1f929032d", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/client/mgmt/companies/${companyId}/expenses/${expense.id} (resources/js/client-management/components/portal/DeleteExpenseDialog.tsx:32)"}, "properties": {"repobilityId": "1fcefb6c98f31b81", "scanner": "scanner-primary", "fingerprint": "cb918aa1f929032d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-56938caf6fb6d0c9", "level": "error", "message": {"text": "Dangling fetch: PUT /api/client/portal/${slug}/projects/${projectSlug}/tasks/${task.id} (resources/js/client-management/components/portal/EditTaskModal.tsx:94)"}, "properties": {"repobilityId": "2ee2d34f23cb375b", "scanner": "scanner-primary", "fingerprint": "56938caf6fb6d0c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1501cbfa373c88fc", "level": "error", "message": {"text": "Dangling fetch: POST /api/client/portal/${slug}/time-entries (resources/js/client-management/components/portal/EditTaskModal.tsx:135)"}, "properties": {"repobilityId": "7b04d4d2a90dd73e", "scanner": "scanner-primary", "fingerprint": "1501cbfa373c88fc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-34deefe8d3f82bd9", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug}/time-entries (resources/js/client-management/components/portal/ClientPortalTimePage.tsx:53)"}, "properties": {"repobilityId": "b9a244f6c5f782ed", "scanner": "scanner-primary", "fingerprint": "34deefe8d3f82bd9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9a83307b66332c45", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug}/projects (resources/js/client-management/components/portal/ClientPortalTimePage.tsx:67)"}, "properties": {"repobilityId": "93cea54f8318bf72", "scanner": "scanner-primary", "fingerprint": "9a83307b66332c45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1e3bbfc2034012d7", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug} (resources/js/client-management/components/portal/ClientPortalTimePage.tsx:79)"}, "properties": {"repobilityId": "5db36c59c302dfc7", "scanner": "scanner-primary", "fingerprint": "1e3bbfc2034012d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ea7d18fb461c4591", "level": "error", "message": {"text": "Dangling fetch: POST /api/client/portal/${slug}/projects/${projectSlug}/tasks (resources/js/client-management/components/portal/NewTaskModal.tsx:44)"}, "properties": {"repobilityId": "bea433e3115f50d8", "scanner": "scanner-primary", "fingerprint": "ea7d18fb461c4591", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c1f422bdf1c6b592", "level": "error", "message": {"text": "Dangling fetch: GET /api/user (resources/js/client-management/components/portal/NewTimeEntryModal.tsx:88)"}, "properties": {"repobilityId": "835102b44a1ce8c6", "scanner": "scanner-primary", "fingerprint": "c1f422bdf1c6b592", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9215a1fe2f9c797", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/client/portal/${slug}/time-entries/${entry.id} (resources/js/client-management/components/portal/NewTimeEntryModal.tsx:200)"}, "properties": {"repobilityId": "71b959542ab7fb2c", "scanner": "scanner-primary", "fingerprint": "b9215a1fe2f9c797", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-816832b96e79614c", "level": "error", "message": {"text": "Dangling fetch: POST /api/client/portal/${slug}/projects (resources/js/client-management/components/portal/NewProjectModal.tsx:29)"}, "properties": {"repobilityId": "2cc0f941ccd34bbf", "scanner": "scanner-primary", "fingerprint": "816832b96e79614c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-444f186fbc07b993", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug} (resources/js/client-management/components/portal/ClientPortalInvoicesPage.tsx:32)"}, "properties": {"repobilityId": "a5e3df6008ed0e98", "scanner": "scanner-primary", "fingerprint": "444f186fbc07b993", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9083e9da4cce9ec7", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug}/invoices (resources/js/client-management/components/portal/ClientPortalInvoicesPage.tsx:44)"}, "properties": {"repobilityId": "1e094d80ec29102b", "scanner": "scanner-primary", "fingerprint": "9083e9da4cce9ec7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59223d54b4aa2ccf", "level": "error", "message": {"text": "Dangling fetch: POST /api/client/mgmt/companies/${company.id}/invoices/generate-all (resources/js/client-management/components/portal/ClientPortalInvoicesPage.tsx:75)"}, "properties": {"repobilityId": "7a3c2e5fc4f6e5f3", "scanner": "scanner-primary", "fingerprint": "59223d54b4aa2ccf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-209ca38b51b85d2b", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug}/agreements/${agreementId} (resources/js/client-management/components/portal/ClientPortalAgreementPage.tsx:52)"}, "properties": {"repobilityId": "ac9e6503bcda11b7", "scanner": "scanner-primary", "fingerprint": "209ca38b51b85d2b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-362b84877e31152f", "level": "error", "message": {"text": "Dangling fetch: GET /api/client/portal/${slug}/invoices (resources/js/client-management/components/portal/ClientPortalAgreementPage.tsx:69)"}, "properties": {"repobilityId": "91b93cd81ceac625", "scanner": "scanner-primary", "fingerprint": "362b84877e31152f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-153fa45b84d11c14", "level": "error", "message": {"text": "Dangling fetch: POST /api/client/portal/${slug}/agreements/${agreementId}/sign (resources/js/client-management/components/portal/ClientPortalAgreementPage.tsx:108)"}, "properties": {"repobilityId": "a33009ad8a26bf0f", "scanner": "scanner-primary", "fingerprint": "153fa45b84d11c14", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6acfd907fefad109", "level": "error", "message": {"text": "Dangling fetch: GET /api/user (resources/js/client-management/__tests__/portal-hydration.test.tsx:132)"}, "properties": {"repobilityId": "d2e600adf8779d6b", "scanner": "scanner-primary", "fingerprint": "6acfd907fefad109", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-231198ea46edc434", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/payslips/${payslip_id} (resources/js/lib/api.ts:42)"}, "properties": {"repobilityId": "38e598552c760df4", "scanner": "scanner-primary", "fingerprint": "231198ea46edc434", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2f4219ee7aa7258b", "level": "error", "message": {"text": "Dangling fetch: GET /api/payslips/${payslip_id} (resources/js/lib/api.ts:58)"}, "properties": {"repobilityId": "499c767897039b84", "scanner": "scanner-primary", "fingerprint": "2f4219ee7aa7258b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8977ca34e320320a", "level": "error", "message": {"text": "Dangling fetch: POST /api/payslips/${payslip_id}/estimated-status (resources/js/lib/api.ts:69)"}, "properties": {"repobilityId": "e6a54f45b0873787", "scanner": "scanner-primary", "fingerprint": "8977ca34e320320a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b07df6b1c4f7477", "level": "note", "message": {"text": "Unused endpoint: POST /api/genai/import/request-upload"}, "properties": {"repobilityId": "1c5969ed8ed58521", "scanner": "scanner-primary", "fingerprint": "8b07df6b1c4f7477", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b6c9118bccc551d8", "level": "note", "message": {"text": "Unused endpoint: POST /api/genai/import/jobs"}, "properties": {"repobilityId": "876dd7f28da5e882", "scanner": "scanner-primary", "fingerprint": "b6c9118bccc551d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a1e1e7ba2e17efd", "level": "note", "message": {"text": "Unused endpoint: GET /api/agent/setup-tokens"}, "properties": {"repobilityId": "24608c27f7248f06", "scanner": "scanner-primary", "fingerprint": "9a1e1e7ba2e17efd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8117499b063cab33", "level": "note", "message": {"text": "Unused endpoint: POST /api/user/generate-mcp-api-key"}, "properties": {"repobilityId": "2e7d4e026d1edecd", "scanner": "scanner-primary", "fingerprint": "8117499b063cab33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d7a856d8259e30d", "level": "note", "message": {"text": "Unused endpoint: GET /api/user/ai-prefs"}, "properties": {"repobilityId": "b59c43403263073d", "scanner": "scanner-primary", "fingerprint": "4d7a856d8259e30d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1eda6748c8a19b19", "level": "note", "message": {"text": "Unused endpoint: POST /api/user/ai-prefs/models"}, "properties": {"repobilityId": "b95effd5fbca903a", "scanner": "scanner-primary", "fingerprint": "1eda6748c8a19b19", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b257564718b12f3", "level": "note", "message": {"text": "Unused endpoint: POST /api/user/ai-prefs"}, "properties": {"repobilityId": "232244663a2b770d", "scanner": "scanner-primary", "fingerprint": "9b257564718b12f3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8122fef65f4b3afc", "level": "note", "message": {"text": "Unused endpoint: GET /api/class-action-claims"}, "properties": {"repobilityId": "a036beac124506e3", "scanner": "scanner-primary", "fingerprint": "8122fef65f4b3afc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1d194554a54efc4f", "level": "note", "message": {"text": "Unused endpoint: POST /api/class-action-claims"}, "properties": {"repobilityId": "d321526735f8b7d2", "scanner": "scanner-primary", "fingerprint": "1d194554a54efc4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3a8f36daa01cf0b", "level": "note", "message": {"text": "Unused endpoint: POST /api/genai/import/paste"}, "properties": {"repobilityId": "45e640dee74f7ea5", "scanner": "scanner-primary", "fingerprint": "e3a8f36daa01cf0b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c68982a4b46e2fe", "level": "note", "message": {"text": "Unused endpoint: POST /api/agent/setup-tokens"}, "properties": {"repobilityId": "c5faf44af8daaf6a", "scanner": "scanner-primary", "fingerprint": "0c68982a4b46e2fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23431077cf7f4c32", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/user-deductions"}, "properties": {"repobilityId": "26bf475ecd006760", "scanner": "scanner-primary", "fingerprint": "23431077cf7f4c32", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-def98fd76cbd70fe", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/tax-line-adjustments"}, "properties": {"repobilityId": "d39421cedc0ba8a7", "scanner": "scanner-primary", "fingerprint": "def98fd76cbd70fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-181408a4606378c6", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/tags/apply"}, "properties": {"repobilityId": "44ed20571e63278c", "scanner": "scanner-primary", "fingerprint": "181408a4606378c6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17c3450326a83aad", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/tags/remove"}, "properties": {"repobilityId": "2f83fdcd6b7a26e0", "scanner": "scanner-primary", "fingerprint": "17c3450326a83aad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85e94d582a645df0", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/transactions/batch-update"}, "properties": {"repobilityId": "a556b43526f850d7", "scanner": "scanner-primary", "fingerprint": "85e94d582a645df0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa29cb9fc967fbcf", "level": "note", "message": {"text": "Unused endpoint: PUT /api/finance/form-8829"}, "properties": {"repobilityId": "a654154aa2613d07", "scanner": "scanner-primary", "fingerprint": "aa29cb9fc967fbcf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67ea24575a4fe1a5", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/tax-documents/manual"}, "properties": {"repobilityId": "c42971fac2322d90", "scanner": "scanner-primary", "fingerprint": "67ea24575a4fe1a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc658725a550b650", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/transactions/link"}, "properties": {"repobilityId": "37eadee2475c2284", "scanner": "scanner-primary", "fingerprint": "bc658725a550b650", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-61502195f3b5f108", "level": "note", "message": {"text": "Unused endpoint: GET /api/finance/accounts/basic"}, "properties": {"repobilityId": "2bbf4279b665defe", "scanner": "scanner-primary", "fingerprint": "61502195f3b5f108", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-05a101fbbee59ee2", "level": "note", "message": {"text": "Unused endpoint: GET /api/finance/employment-entities"}, "properties": {"repobilityId": "e7e8d6a2d0b146b7", "scanner": "scanner-primary", "fingerprint": "05a101fbbee59ee2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-22860abd8ac4e1b5", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/employment-entities"}, "properties": {"repobilityId": "f597f441468dee7c", "scanner": "scanner-primary", "fingerprint": "22860abd8ac4e1b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee54390e6c3c59b2", "level": "note", "message": {"text": "Unused endpoint: GET /api/finance/schedule-c"}, "properties": {"repobilityId": "9826ab501a3221bb", "scanner": "scanner-primary", "fingerprint": "ee54390e6c3c59b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f06917c584699c2", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/documents/request-upload"}, "properties": {"repobilityId": "b1871c1920e2be54", "scanner": "scanner-primary", "fingerprint": "3f06917c584699c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23fec2d1cc25c757", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/documents"}, "properties": {"repobilityId": "240eb4a72f2c7cc0", "scanner": "scanner-primary", "fingerprint": "23fec2d1cc25c757", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d03f5d3dbd924218", "level": "note", "message": {"text": "Unused endpoint: GET /api/finance/employment-entities?visible_only=true"}, "properties": {"repobilityId": "8bd7b403a166734d", "scanner": "scanner-primary", "fingerprint": "d03f5d3dbd924218", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a89bf366be385030", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/tags"}, "properties": {"repobilityId": "3c9f6c8c17df943d", "scanner": "scanner-primary", "fingerprint": "a89bf366be385030", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b3d026e62945ada", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/lot-reconciliation-links/relink"}, "properties": {"repobilityId": "cc35a2de8132e3c0", "scanner": "scanner-primary", "fingerprint": "2b3d026e62945ada", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2004f816ea1a7d71", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/user-tax-states"}, "properties": {"repobilityId": "f031b015d52eb76d", "scanner": "scanner-primary", "fingerprint": "2004f816ea1a7d71", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccbb0ac5d36fc1de", "level": "note", "message": {"text": "Unused endpoint: GET /api/finance/rules"}, "properties": {"repobilityId": "f08c6bc0d32f0e10", "scanner": "scanner-primary", "fingerprint": "ccbb0ac5d36fc1de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-570208b7a97c3a84", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/rules/reorder"}, "properties": {"repobilityId": "0f61f2f258f3717a", "scanner": "scanner-primary", "fingerprint": "570208b7a97c3a84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9cc21ea01e204a89", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/rules"}, "properties": {"repobilityId": "eefddb57321e54ae", "scanner": "scanner-primary", "fingerprint": "9cc21ea01e204a89", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54095523d64b1b57", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/rules/preview-matches"}, "properties": {"repobilityId": "5e72301cf3ec28e5", "scanner": "scanner-primary", "fingerprint": "54095523d64b1b57", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3cb131a3145770fc", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/lots/search-opening"}, "properties": {"repobilityId": "24c62050dd7b8d61", "scanner": "scanner-primary", "fingerprint": "3cb131a3145770fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0a17c34d2b8d3a6", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/lots/save-assignment"}, "properties": {"repobilityId": "6534776915ff44b8", "scanner": "scanner-primary", "fingerprint": "e0a17c34d2b8d3a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67cb546db10ecde1", "level": "note", "message": {"text": "Unused endpoint: POST /api/finance/transactions/batch-delete"}, "properties": {"repobilityId": "76a14d8081d61d0e", "scanner": "scanner-primary", "fingerprint": "67cb546db10ecde1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd451241f3f1d828", "level": "note", "message": {"text": "Unused endpoint: GET /api/license-keys"}, "properties": {"repobilityId": "19a32bfd02f9a098", "scanner": "scanner-primary", "fingerprint": "dd451241f3f1d828", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4cb99df88fb4919e", "level": "note", "message": {"text": "Unused endpoint: POST /api/license-keys"}, "properties": {"repobilityId": "ddb985c202bf5de9", "scanner": "scanner-primary", "fingerprint": "4cb99df88fb4919e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8d5a6f96b176af1", "level": "note", "message": {"text": "Unused endpoint: POST /api/license-keys/import"}, "properties": {"repobilityId": "a7b0674311cfbca9", "scanner": "scanner-primary", "fingerprint": "a8d5a6f96b176af1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33279a44214d2d71", "level": "note", "message": {"text": "Unused endpoint: POST /api/tools/toon-json/save"}, "properties": {"repobilityId": "576a3c051b63f5da", "scanner": "scanner-primary", "fingerprint": "33279a44214d2d71", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c21241fbad22c92e", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/tax-normalization-review/acknowledge"}, "properties": {"repobilityId": "5bfb77f73a6df7cb", "scanner": "scanner-primary", "fingerprint": "c21241fbad22c92e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d87dcdf3bd8c6d20", "level": "note", "message": {"text": "Unused endpoint: POST /api/payslips/bulk"}, "properties": {"repobilityId": "5eac662e5d10a00a", "scanner": "scanner-primary", "fingerprint": "d87dcdf3bd8c6d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4d87f54d62a1386", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/users"}, "properties": {"repobilityId": "27feae3dcf2266f2", "scanner": "scanner-primary", "fingerprint": "b4d87f54d62a1386", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b934c95ab6afb042", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/feature-permissions"}, "properties": {"repobilityId": "7ea6c73a2c4ed5b7", "scanner": "scanner-primary", "fingerprint": "b934c95ab6afb042", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4aa35f9c575955ad", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/users"}, "properties": {"repobilityId": "8cfd8665e13fb8d6", "scanner": "scanner-primary", "fingerprint": "4aa35f9c575955ad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-26200cd45df4ca97", "level": "note", "message": {"text": "Unused endpoint: GET /api/rsu"}, "properties": {"repobilityId": "dd8a510b96f0a2c2", "scanner": "scanner-primary", "fingerprint": "26200cd45df4ca97", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de17e3b36f378b0c", "level": "note", "message": {"text": "Unused endpoint: GET /api/financial-planning/career-comparison/latest"}, "properties": {"repobilityId": "78ffdf1b75538287", "scanner": "scanner-primary", "fingerprint": "de17e3b36f378b0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-82085e9be9ccacef", "level": "note", "message": {"text": "Unused endpoint: POST /api/rsu"}, "properties": {"repobilityId": "072517f7a3a59b44", "scanner": "scanner-primary", "fingerprint": "82085e9be9ccacef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c24bb440d5c14ca7", "level": "note", "message": {"text": "Unused endpoint: POST /api/rsu/backfill-vest-prices"}, "properties": {"repobilityId": "0cd7b14c4ebe3800", "scanner": "scanner-primary", "fingerprint": "c24bb440d5c14ca7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec2efbd00d9d8f04", "level": "note", "message": {"text": "Unused endpoint: GET /api/phr/patients"}, "properties": {"repobilityId": "3f6364839a0f74a8", "scanner": "scanner-primary", "fingerprint": "ec2efbd00d9d8f04", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}