{"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-c3762f778922d211", "name": "Possibly dead Python function: emit", "shortDescription": {"text": "Possibly dead Python function: emit"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-feaa608370a06e3e", "name": "Possibly dead Python function: fmt_date", "shortDescription": {"text": "Possibly dead Python function: fmt_date"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-208f73bfb9596737", "name": "Possibly dead Python function: cmd_start", "shortDescription": {"text": "Possibly dead Python function: cmd_start"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d1f71a1e33c4341", "name": "Possibly dead Python function: cmd_stats", "shortDescription": {"text": "Possibly dead Python function: cmd_stats"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3142eeb6ed0a4298", "name": "Possibly dead Python function: cmd_low_stock", "shortDescription": {"text": "Possibly dead Python function: cmd_low_stock"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f20021a6c00df0f", "name": "Possibly dead Python function: cmd_debtors", "shortDescription": {"text": "Possibly dead Python function: cmd_debtors"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-59bd4c5226f40937", "name": "Possibly dead Python function: cmd_sales", "shortDescription": {"text": "Possibly dead Python function: cmd_sales"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c8ea47e959be43d3", "name": "Possibly dead Python function: cmd_report", "shortDescription": {"text": "Possibly dead Python function: cmd_report"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af58596a50a39065", "name": "Possibly dead Python function: cmd_tasks", "shortDescription": {"text": "Possibly dead Python function: cmd_tasks"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-29ac46b58ccf572b", "name": "Possibly dead Python function: cb_tasks", "shortDescription": {"text": "Possibly dead Python function: cb_tasks"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-22df7ee49ad4fb61", "name": "Possibly dead Python function: cb_stats", "shortDescription": {"text": "Possibly dead Python function: cb_stats"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6f2c167137c59f2", "name": "Possibly dead Python function: cb_lowstock", "shortDescription": {"text": "Possibly dead Python function: cb_lowstock"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fd768ce3b573458", "name": "Possibly dead Python function: cb_debtors", "shortDescription": {"text": "Possibly dead Python function: cb_debtors"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dcc39b7a636bfb3a", "name": "Possibly dead Python function: cb_goto", "shortDescription": {"text": "Possibly dead Python function: cb_goto"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2db783729305a916", "name": "Possibly dead Python function: cmd_employees", "shortDescription": {"text": "Possibly dead Python function: cmd_employees"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-559e7e1592aa749d", "name": "Possibly dead Python function: cmd_employee", "shortDescription": {"text": "Possibly dead Python function: cmd_employee"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e39c3e98f8c0d99e", "name": "Possibly dead Python function: cb_employee", "shortDescription": {"text": "Possibly dead Python function: cb_employee"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-361a15af81721f74", "name": "Possibly dead Python function: cmd_broadcast", "shortDescription": {"text": "Possibly dead Python function: cmd_broadcast"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06cb8ef7f8466028", "name": "Possibly dead Python function: send_broadcast", "shortDescription": {"text": "Possibly dead Python function: send_broadcast"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-030a5eb3a2df505b", "name": "Possibly dead Python function: t", "shortDescription": {"text": "Possibly dead Python function: t"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1c515d46e8d8fe1a", "name": "Possibly dead Python function: on_start_v2", "shortDescription": {"text": "Possibly dead Python function: on_start_v2"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d0579983bded1be", "name": "Possibly dead Python function: cmd_tasks", "shortDescription": {"text": "Possibly dead Python function: cmd_tasks"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a03ec701d5b14013", "name": "Possibly dead Python function: callback_task_start", "shortDescription": {"text": "Possibly dead Python function: callback_task_start"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b348bd67ccf2351c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PaymentNumPad.jsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PaymentNumPad.jsx:60"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-492ae8a6fb3d3284", "name": "Icon-only button without accessible name \u2014 frontend/src/components/tasks/TaskDetailModal.jsx:101", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/tasks/TaskDetailModal.jsx:101"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffb1b3ccb20705c0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/TaskCard.jsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/TaskCard.jsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5513320d1a106aba", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/KanbanColumn.jsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/KanbanColumn.jsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10fdb0b6e592a3bc", "name": "Icon-only button without accessible name \u2014 frontend/src/components/tasks/ColumnsConfigModal.jsx:59", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/tasks/ColumnsConfigModal.jsx:59"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32b581da251c56aa", "name": "Icon-only button without accessible name \u2014 frontend/src/components/tasks/TaskFormModal.jsx:76", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/tasks/TaskFormModal.jsx:76"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc2d0fde24e82f6b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/TaskFormModal.jsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/TaskFormModal.jsx:181"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23b3ae3d1a9a9f6b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/tasks/TasksCustomers.jsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/tasks/TasksCustomers.jsx:75"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1630ed257a678123", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/AdminLayout.jsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/AdminLayout.jsx:207"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-036f840383ff8edd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Reports.jsx:788", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Reports.jsx:788"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33385278a3f737fa", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Expenses.jsx:328", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Expenses.jsx:328"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7481e53a016e3671", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Leaves.jsx:242", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Leaves.jsx:242"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c4fa4086775ff31", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Dashboard.jsx:523", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Dashboard.jsx:523"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce62704a2a71f3f9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/TelegramBroadcast.jsx:368", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/TelegramBroadcast.jsx:368"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b57b640bbdd4fcf7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Employees.jsx:383", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Employees.jsx:383"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76528256e130bf32", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/inventory/StockTab.jsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/inventory/StockTab.jsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61376d22c2f395b8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/customers/DebtorsTab.jsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/customers/DebtorsTab.jsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4983c781a96530de", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/sales/HistoryTab.jsx:216", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/sales/HistoryTab.jsx:216"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba22b3730c4ba884", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/products/ProductImportModal.jsx:306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/products/ProductImportModal.jsx:306"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6fceeb9bc004069e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/products/LabelsTab.jsx:272", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/products/LabelsTab.jsx:272"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea109966ff41c8d6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/products/ProductsTab.jsx:476", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/products/ProductsTab.jsx:476"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-325ad42452501274", "name": "Icon-only button without accessible name \u2014 frontend/src/pages/pos/POSPage.jsx:2054", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/pages/pos/POSPage.jsx:2054"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3820662cdc14efd1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/pos/POSPage.jsx:1617", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/pos/POSPage.jsx:1617"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-15fa60a01e1078d7", "name": "Possible secret in frontend/audit-shots.cjs", "shortDescription": {"text": "Possible secret in frontend/audit-shots.cjs"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-37289f73c8ab18ad", "name": "Possible secret in frontend/labels-fname.cjs", "shortDescription": {"text": "Possible secret in frontend/labels-fname.cjs"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-9d65fcf5c57d60ca", "name": "Possible secret in frontend/receipt-smoke.cjs", "shortDescription": {"text": "Possible secret in frontend/receipt-smoke.cjs"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-7ff2ac6dfc03342b", "name": "Possible secret in frontend/labels-shots.cjs", "shortDescription": {"text": "Possible secret in frontend/labels-shots.cjs"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-2fa6fcbb18b1e5f1", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/api/axios.js:28", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/api/axios.js:28"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-586bb5d8b4154692", "name": "Insecure pattern 'document_write' in frontend/src/components/receipt/ReceiptPrint.js:348", "shortDescription": {"text": "Insecure pattern 'document_write' in frontend/src/components/receipt/ReceiptPrint.js:348"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ba1eafd409bc00a", "name": "Insecure pattern 'document_write' in frontend/src/pages/pos/POSPage.jsx:2677", "shortDescription": {"text": "Insecure pattern 'document_write' in frontend/src/pages/pos/POSPage.jsx:2677"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9af5b976c1f0d670", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/context/AuthContext.jsx:24", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/context/AuthContext.jsx:24"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e233f0f77ff4f643", "name": "Possible secret in backend/apps/users/management/commands/seed_data.py", "shortDescription": {"text": "Possible secret in backend/apps/users/management/commands/seed_data.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6296dcc5d4095415", "name": "Very large file: frontend/src/pages/pos/POSPage.jsx (3229 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/pos/POSPage.jsx (3229 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-d85c0fb0c442a498", "name": "Very large file: backend/apps/telegram_broadcast/master_bot.py (1945 lines)", "shortDescription": {"text": "Very large file: backend/apps/telegram_broadcast/master_bot.py (1945 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "12 test file(s) for 339 source file(s) (ratio 0.04). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 33 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 113 placeholder/mock markers across 39 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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-15aadd63e2d32669", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/audit-shots.cjs:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/audit-shots.cjs:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-81705c54511b0f49", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/receipt-smoke.cjs:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/receipt-smoke.cjs:27"}, "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-81dc00b69b7d0e76", "name": "Commented-code block (6 lines) in frontend/src/pages/pos/POSPage.jsx:22", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/pos/POSPage.jsx:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f856e22ba603e7c", "name": "Legacy-named symbol `create_backup` in backend/apps/backup/urls.py:6", "shortDescription": {"text": "Legacy-named symbol `create_backup` in backend/apps/backup/urls.py:6"}, "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-6f4709c98d06ec42", "name": "Legacy-named symbol `create_backup` in backend/apps/backup/views.py:60", "shortDescription": {"text": "Legacy-named symbol `create_backup` in backend/apps/backup/views.py:60"}, "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-e80052a9123252be", "name": "Likely N+1 query: `for s in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/admin_bot.py:212", "shortDescription": {"text": "Likely N+1 query: `for s in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/admin_bot.py:212"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `s.cashier.get_full_name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9be9f06d526054bb", "name": "Likely N+1 query: `for col in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/admin_bot.py:282", "shortDescription": {"text": "Likely N+1 query: `for col in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/admin_bot.py:282"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `col.name.lower` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a870020248ab8c45", "name": "Likely N+1 query: `for task in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/admin_bot.py:379", "shortDescription": {"text": "Likely N+1 query: `for task in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/admin_bot.py:379"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `task.due_date.date` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dbe02bd850bbf559", "name": "Likely N+1 query: `for broadcast in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/apps.py:25", "shortDescription": {"text": "Likely N+1 query: `for broadcast in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/apps.py:25"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `broadcast.recipients.count` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8086aa3d74a7d968", "name": "Legacy-named symbol `on_start_v2` in backend/apps/telegram_broadcast/master_bot.py:907", "shortDescription": {"text": "Legacy-named symbol `on_start_v2` in backend/apps/telegram_broadcast/master_bot.py:907"}, "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-34cac441e7f73c1f", "name": "Likely N+1 query: `for debtor in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/signals.py:129", "shortDescription": {"text": "Likely N+1 query: `for debtor in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/signals.py:129"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `debtor.transactions.order_by` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8fa87b62474106f9", "name": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapsched", "shortDescription": {"text": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:103"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `p.supplier.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a2a2427a4cf45c14", "name": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapsched", "shortDescription": {"text": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:106"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `p.due_date.strftime` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d4733061e4779c33", "name": "Likely N+1 query: `for t in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapsched", "shortDescription": {"text": "Likely N+1 query: `for t in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:222"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `t.due_date.date` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d4d532370c68571", "name": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapsched", "shortDescription": {"text": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:270"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `p.supplier.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-67110eae41dd0d4f", "name": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapsched", "shortDescription": {"text": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:276"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `p.supplier.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f1cd9b1ab1d016f0", "name": "Legacy-named symbol `done_old` in backend/apps/tasks/views.py:219", "shortDescription": {"text": "Legacy-named symbol `done_old` in backend/apps/tasks/views.py:219"}, "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-6750e2e8d1ea8a15", "name": "Legacy-named symbol `done_old` in backend/apps/tasks/management/commands/auto_archive_tasks.py:19", "shortDescription": {"text": "Legacy-named symbol `done_old` in backend/apps/tasks/management/commands/auto_archive_tasks.py:19"}, "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-481b96e0bf49057e", "name": "Likely N+1 query: `for purchase in \u2026` triggers a query per row \u2014 backend/apps/purchases/analytics.py:117", "shortDescription": {"text": "Likely N+1 query: `for purchase in \u2026` triggers a query per row \u2014 backend/apps/purchases/analytics.py:117"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `purchase.supplier.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e2016cfc47347d56", "name": "Likely N+1 query: `for e in \u2026` triggers a query per row \u2014 backend/apps/hr/views.py:128", "shortDescription": {"text": "Likely N+1 query: `for e in \u2026` triggers a query per row \u2014 backend/apps/hr/views.py:128"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `e.date.day` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-99b62ebffed20cbc", "name": "Legacy-named symbol `position_old` in backend/apps/hr/migrations/0002_position_fk.py:27", "shortDescription": {"text": "Legacy-named symbol `position_old` in backend/apps/hr/migrations/0002_position_fk.py:27"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9e431705da7c446a", "name": "Commented-code block (5 lines) in backend/apps/sales/serializers.py:157", "shortDescription": {"text": "Commented-code block (5 lines) in backend/apps/sales/serializers.py:157"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e631820dce76a0bc", "name": "Commented-code block (5 lines) in backend/apps/sales/migrations/0013_saleitem_cost_is_estimate.py:6", "shortDescription": {"text": "Commented-code block (5 lines) in backend/apps/sales/migrations/0013_saleitem_cost_is_estimate.py:6"}, "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-087c3dcaa2469b93", "name": "Commented-code block (6 lines) in backend/apps/reports/views.py:1015", "shortDescription": {"text": "Commented-code block (6 lines) in backend/apps/reports/views.py:1015"}, "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-3a0211618f4353f8", "name": "Likely N+1 query: `for s in \u2026` triggers a query per row \u2014 backend/apps/reports/views.py:332", "shortDescription": {"text": "Likely N+1 query: `for s in \u2026` triggers a query per row \u2014 backend/apps/reports/views.py:332"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `s.cashier.get_full_name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-09b1baa91feb772a", "name": "Commented-code block (7 lines) in backend/apps/products/serializers.py:49", "shortDescription": {"text": "Commented-code block (7 lines) in backend/apps/products/serializers.py:49"}, "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-ea5ef7078b879ac0", "name": "Commented-code block (6 lines) in backend/apps/products/barcode_service.py:325", "shortDescription": {"text": "Commented-code block (6 lines) in backend/apps/products/barcode_service.py:325"}, "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-3741f48b4e962278", "name": "Likely N+1 query: `for m in \u2026` triggers a query per row \u2014 backend/apps/products/views.py:147", "shortDescription": {"text": "Likely N+1 query: `for m in \u2026` triggers a query per row \u2014 backend/apps/products/views.py:147"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `m.created_at.isoformat` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-77cffd23b2451291", "name": "Likely N+1 query: `for cat in \u2026` triggers a query per row \u2014 backend/apps/products/management/commands/fix_categories.py:", "shortDescription": {"text": "Likely N+1 query: `for cat in \u2026` triggers a query per row \u2014 backend/apps/products/management/commands/fix_categories.py:44"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `cat.name.lower` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-68f04a53f412add7", "name": "Likely N+1 query: `for model in \u2026` triggers a query per row \u2014 backend/apps/products/management/commands/find_orphan_move", "shortDescription": {"text": "Likely N+1 query: `for model in \u2026` triggers a query per row \u2014 backend/apps/products/management/commands/find_orphan_movements.py:36"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `model.objects.values_list` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a9b3a4d8161a2f10", "name": "Stub function `reverse_migrate` (body is just `pass`/`return`) \u2014 backend/apps/products/migrations/0007_dual_stock_fields", "shortDescription": {"text": "Stub function `reverse_migrate` (body is just `pass`/`return`) \u2014 backend/apps/products/migrations/0007_dual_stock_fields.py:15"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-434f824f9f600a28", "name": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/apps/products/migrations/0012_backfill_balance_aft", "shortDescription": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/apps/products/migrations/0012_backfill_balance_after.py:32"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee958e91955ae292", "name": "Commented-code block (5 lines) in backend/scripts/repair_2026_06_11_phase_d.py:3", "shortDescription": {"text": "Commented-code block (5 lines) in backend/scripts/repair_2026_06_11_phase_d.py:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/apps/users/permissions.py:has_permission, backend/apps/users/permissions.py:has_permission, backend/apps/users/permissions.py:has_permission, backend/apps/users/permissions.py:has_permission\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/apps/telegram_settings/models.py:bot_token, backend/apps/telegram_settings/models.py:bot_token\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/apps/telegram_broadcast/master_bot.py:cmd_done, backend/apps/telegram_broadcast/master_bot.py:cmd_start_task, backend/apps/telegram_broadcast/master_bot.py:cmd_materials\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b010bca45b9a9f9d", "name": "Frontend route `products` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `products` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f9d3e8d9954fce1", "name": "Frontend route `categories` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `categories` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4fa0179039497f03", "name": "Frontend route `suppliers` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `suppliers` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0452765cfd151bc8", "name": "Frontend route `services` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `services` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db8fd627e259dfdc", "name": "Frontend route `inventory` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `inventory` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10fd23afe3a04750", "name": "Frontend route `sales` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `sales` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7ad013e7ccc633c8", "name": "Frontend route `shifts` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `shifts` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2cbd06316029c440", "name": "Frontend route `customers` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `customers` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27a0752649b3d062", "name": "Frontend route `debtors` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `debtors` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-370187edf1060c6f", "name": "Frontend route `loyalty` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `loyalty` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f95a7341f0739b2", "name": "Frontend route `reports` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `reports` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b51fd6b3e8caa47a", "name": "Frontend route `expenses` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `expenses` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28053f0e03b67196", "name": "Frontend route `backup` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `backup` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9f71e47971e3a452", "name": "Frontend route `hr` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `hr` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f0262c696be89cd", "name": "Frontend route `employees` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `employees` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fce476cb2e9138c1", "name": "Frontend route `timesheet` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `timesheet` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7b2dd3a3c6df6c2b", "name": "Frontend route `payroll` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `payroll` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-933318194cfc7fcf", "name": "Frontend route `leaves` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `leaves` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c41903228663ce9", "name": "Frontend route `hr-reports` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `hr-reports` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51b1524af6894435", "name": "Frontend route `print-labels` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `print-labels` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-832383f51e14d302", "name": "Frontend route `broadcast` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `broadcast` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-93008a33ae7ad7cb", "name": "Frontend route `purchases` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `purchases` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c66ebbcde4f320e2", "name": "Frontend route `purchases/analytics` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `purchases/analytics` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f4859238d70b32ea", "name": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d93bfbb18dd1830d", "name": "Frontend route `system-settings` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `system-settings` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-229dcd58222f8cc9", "name": "Frontend route `users` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `users` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3a5a72474e32fdd2", "name": "Frontend route `branches` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `branches` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7004d2be6da1176d", "name": "Frontend route `telegram` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `telegram` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aabcf0d74bb29637", "name": "Frontend route `printer` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `printer` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-243d32e552314142", "name": "Frontend route `currency` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `currency` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17c1da10335b1177", "name": "Frontend route `tasks` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `tasks` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5fbd72bb948d6cc2", "name": "Django CBV `CustomTokenObtainPairView` lacks `LoginRequiredMixin` \u2014 backend/apps/users/views.py:12", "shortDescription": {"text": "Django CBV `CustomTokenObtainPairView` lacks `LoginRequiredMixin` \u2014 backend/apps/users/views.py:12"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-244ce1865bcc2688", "name": "Django view `save_bot` may be unauthenticated \u2014 backend/apps/telegram_settings/views.py:25", "shortDescription": {"text": "Django view `save_bot` may be unauthenticated \u2014 backend/apps/telegram_settings/views.py:25"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c3caf1f6a24515b9", "name": "Django view `toggle_bot` may be unauthenticated \u2014 backend/apps/telegram_settings/views.py:77", "shortDescription": {"text": "Django view `toggle_bot` may be unauthenticated \u2014 backend/apps/telegram_settings/views.py:77"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5449bc23c69ec682", "name": "Django view `create_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:60", "shortDescription": {"text": "Django view `create_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:60"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a799161a7f585307", "name": "Django view `list_backups` may be unauthenticated \u2014 backend/apps/backup/views.py:116", "shortDescription": {"text": "Django view `list_backups` may be unauthenticated \u2014 backend/apps/backup/views.py:116"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-74d628c517aa5c1a", "name": "Django view `download_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:134", "shortDescription": {"text": "Django view `download_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:134"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d1b8d5ce0711e88", "name": "Django view `delete_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:151", "shortDescription": {"text": "Django view `delete_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:151"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c176473928080def", "name": "Django view `preview_import` may be unauthenticated \u2014 backend/apps/backup/views.py:167", "shortDescription": {"text": "Django view `preview_import` may be unauthenticated \u2014 backend/apps/backup/views.py:167"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-32f8061e68561a5b", "name": "Django view `import_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:188", "shortDescription": {"text": "Django view `import_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:188"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f8b9fde834baef2a", "name": "Django view `available_models` may be unauthenticated \u2014 backend/apps/backup/views.py:286", "shortDescription": {"text": "Django view `available_models` may be unauthenticated \u2014 backend/apps/backup/views.py:286"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1a1dc43417b64d3", "name": "Django view `card_by_number` may be unauthenticated \u2014 backend/apps/loyalty/views.py:30", "shortDescription": {"text": "Django view `card_by_number` may be unauthenticated \u2014 backend/apps/loyalty/views.py:30"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6961d56d7ce62667", "name": "Django view `adjust_bonus` may be unauthenticated \u2014 backend/apps/loyalty/views.py:40", "shortDescription": {"text": "Django view `adjust_bonus` may be unauthenticated \u2014 backend/apps/loyalty/views.py:40"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bb0995346dfdfe70", "name": "Django view `broadcast_recipients_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:37", "shortDescription": {"text": "Django view `broadcast_recipients_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:37"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7ecddf18a2e93817", "name": "Django view `send_now_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:47", "shortDescription": {"text": "Django view `send_now_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:47"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12aeffb186bc9e14", "name": "Django view `individual_send_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:78", "shortDescription": {"text": "Django view `individual_send_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:78"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9cd2a8f44493c4b1", "name": "Django view `schedule_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:98", "shortDescription": {"text": "Django view `schedule_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:98"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c15c0739e7a7ff2f", "name": "Django view `cancel_broadcast_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:133", "shortDescription": {"text": "Django view `cancel_broadcast_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:133"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8d11ef26ff4feeaf", "name": "Django view `resend_broadcast_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:145", "shortDescription": {"text": "Django view `resend_broadcast_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:145"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-334d46c14e91dd18", "name": "Django view `recipient_count_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:165", "shortDescription": {"text": "Django view `recipient_count_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:165"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-654d021558242eec", "name": "Django view `print_receipt_view` may be unauthenticated \u2014 backend/apps/printer/views.py:32", "shortDescription": {"text": "Django view `print_receipt_view` may be unauthenticated \u2014 backend/apps/printer/views.py:32"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d08f56b3b1d4e20", "name": "Django view `printer_status_view` may be unauthenticated \u2014 backend/apps/printer/views.py:89", "shortDescription": {"text": "Django view `printer_status_view` may be unauthenticated \u2014 backend/apps/printer/views.py:89"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7cc14d97bf43b51f", "name": "Django view `pay_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:48", "shortDescription": {"text": "Django view `pay_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:48"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72756c689aebbed8", "name": "Django view `payments_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:107", "shortDescription": {"text": "Django view `payments_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:107"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed49b99db64eb794", "name": "Django view `overdue_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:127", "shortDescription": {"text": "Django view `overdue_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:127"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-18e5fabd57f06fbe", "name": "Django view `upcoming_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:134", "shortDescription": {"text": "Django view `upcoming_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:134"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fbe616654c7c5fcf", "name": "Django view `summary_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:148", "shortDescription": {"text": "Django view `summary_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:148"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d53cca166c4b38a4", "name": "Django view `analytics_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:169", "shortDescription": {"text": "Django view `analytics_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:169"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5f753478f0976ed0", "name": "Django view `notifications_list` may be unauthenticated \u2014 backend/apps/purchases/views.py:178", "shortDescription": {"text": "Django view `notifications_list` may be unauthenticated \u2014 backend/apps/purchases/views.py:178"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-38a4915367fd12e5", "name": "Django view `notification_read` may be unauthenticated \u2014 backend/apps/purchases/views.py:189", "shortDescription": {"text": "Django view `notification_read` may be unauthenticated \u2014 backend/apps/purchases/views.py:189"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3ab346f7410c668", "name": "Django view `notification_read_all` may be unauthenticated \u2014 backend/apps/purchases/views.py:201", "shortDescription": {"text": "Django view `notification_read_all` may be unauthenticated \u2014 backend/apps/purchases/views.py:201"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d742ed29a4f9a4ea", "name": "Django view `open_shift` may be unauthenticated \u2014 backend/apps/shifts/views.py:58", "shortDescription": {"text": "Django view `open_shift` may be unauthenticated \u2014 backend/apps/shifts/views.py:58"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72f1dd5b63ce59e5", "name": "Django view `close_shift` may be unauthenticated \u2014 backend/apps/shifts/views.py:72", "shortDescription": {"text": "Django view `close_shift` may be unauthenticated \u2014 backend/apps/shifts/views.py:72"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0949bf375f1ebd67", "name": "Django view `current_shift` may be unauthenticated \u2014 backend/apps/shifts/views.py:91", "shortDescription": {"text": "Django view `current_shift` may be unauthenticated \u2014 backend/apps/shifts/views.py:91"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8db1c5f1bc5e184e", "name": "Django view `shift_live_stats` may be unauthenticated \u2014 backend/apps/shifts/views.py:148", "shortDescription": {"text": "Django view `shift_live_stats` may be unauthenticated \u2014 backend/apps/shifts/views.py:148"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d93c3dbbd3a4410c", "name": "Django view `current_shift_stats` may be unauthenticated \u2014 backend/apps/shifts/views.py:194", "shortDescription": {"text": "Django view `current_shift_stats` may be unauthenticated \u2014 backend/apps/shifts/views.py:194"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b01b0f4234877874", "name": "Django view `rates_view` may be unauthenticated \u2014 backend/apps/currency/views.py:12", "shortDescription": {"text": "Django view `rates_view` may be unauthenticated \u2014 backend/apps/currency/views.py:12"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8a27f5dde30caf64", "name": "Django view `fetch_from_cbu` may be unauthenticated \u2014 backend/apps/currency/views.py:54", "shortDescription": {"text": "Django view `fetch_from_cbu` may be unauthenticated \u2014 backend/apps/currency/views.py:54"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b066990c016acc9", "name": "Django view `rate_history` may be unauthenticated \u2014 backend/apps/currency/views.py:66", "shortDescription": {"text": "Django view `rate_history` may be unauthenticated \u2014 backend/apps/currency/views.py:66"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bfc743db62b77965", "name": "Django view `timesheet_month` may be unauthenticated \u2014 backend/apps/hr/views.py:104", "shortDescription": {"text": "Django view `timesheet_month` may be unauthenticated \u2014 backend/apps/hr/views.py:104"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-888b283ad65c60b8", "name": "Django view `timesheet_set_entry` may be unauthenticated \u2014 backend/apps/hr/views.py:174", "shortDescription": {"text": "Django view `timesheet_set_entry` may be unauthenticated \u2014 backend/apps/hr/views.py:174"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9666ddd4eeda59bf", "name": "Django view `timesheet_delete_entry` may be unauthenticated \u2014 backend/apps/hr/views.py:208", "shortDescription": {"text": "Django view `timesheet_delete_entry` may be unauthenticated \u2014 backend/apps/hr/views.py:208"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ce8e5ccb11c7144", "name": "Django view `payroll_month` may be unauthenticated \u2014 backend/apps/hr/views.py:221", "shortDescription": {"text": "Django view `payroll_month` may be unauthenticated \u2014 backend/apps/hr/views.py:221"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b53d25a4d955e5d9", "name": "Django view `payroll_calculate` may be unauthenticated \u2014 backend/apps/hr/views.py:238", "shortDescription": {"text": "Django view `payroll_calculate` may be unauthenticated \u2014 backend/apps/hr/views.py:238"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6993f9c320dfb2ea", "name": "Django view `payroll_calculate_one` may be unauthenticated \u2014 backend/apps/hr/views.py:308", "shortDescription": {"text": "Django view `payroll_calculate_one` may be unauthenticated \u2014 backend/apps/hr/views.py:308"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c4cbe14b98793912", "name": "Django view `payroll_update` may be unauthenticated \u2014 backend/apps/hr/views.py:348", "shortDescription": {"text": "Django view `payroll_update` may be unauthenticated \u2014 backend/apps/hr/views.py:348"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe56f9ecc0be286d", "name": "Django view `leave_approve` may be unauthenticated \u2014 backend/apps/hr/views.py:428", "shortDescription": {"text": "Django view `leave_approve` may be unauthenticated \u2014 backend/apps/hr/views.py:428"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b0504dbfe0836032", "name": "Django view `leave_reject` may be unauthenticated \u2014 backend/apps/hr/views.py:442", "shortDescription": {"text": "Django view `leave_reject` may be unauthenticated \u2014 backend/apps/hr/views.py:442"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11d166bb7a407ead", "name": "Django view `leave_balance` may be unauthenticated \u2014 backend/apps/hr/views.py:456", "shortDescription": {"text": "Django view `leave_balance` may be unauthenticated \u2014 backend/apps/hr/views.py:456"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c66151a2b10d4e4", "name": "Django view `hr_report_payroll_sheet` may be unauthenticated \u2014 backend/apps/hr/views.py:492", "shortDescription": {"text": "Django view `hr_report_payroll_sheet` may be unauthenticated \u2014 backend/apps/hr/views.py:492"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-90d8e410b0416acd", "name": "Django view `hr_report_salary_trend` may be unauthenticated \u2014 backend/apps/hr/views.py:529", "shortDescription": {"text": "Django view `hr_report_salary_trend` may be unauthenticated \u2014 backend/apps/hr/views.py:529"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-62074d2afbdcf4bc", "name": "Django view `hr_report_top_hours` may be unauthenticated \u2014 backend/apps/hr/views.py:552", "shortDescription": {"text": "Django view `hr_report_top_hours` may be unauthenticated \u2014 backend/apps/hr/views.py:552"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d33aa7bd083abc57", "name": "Django view `generate_telegram_invite` may be unauthenticated \u2014 backend/apps/hr/views.py:575", "shortDescription": {"text": "Django view `generate_telegram_invite` may be unauthenticated \u2014 backend/apps/hr/views.py:575"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a91d4fde1dd534b8", "name": "Django view `bot_info` may be unauthenticated \u2014 backend/apps/hr/views.py:608", "shortDescription": {"text": "Django view `bot_info` may be unauthenticated \u2014 backend/apps/hr/views.py:608"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2dfc27a3b1ed9ddb", "name": "Django view `delete_invite` may be unauthenticated \u2014 backend/apps/hr/views.py:623", "shortDescription": {"text": "Django view `delete_invite` may be unauthenticated \u2014 backend/apps/hr/views.py:623"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b31f9b791ee2451b", "name": "Django view `unlink_telegram` may be unauthenticated \u2014 backend/apps/hr/views.py:638", "shortDescription": {"text": "Django view `unlink_telegram` may be unauthenticated \u2014 backend/apps/hr/views.py:638"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-56de8e1661825c91", "name": "Django view `hr_choices` may be unauthenticated \u2014 backend/apps/hr/views.py:654", "shortDescription": {"text": "Django view `hr_choices` may be unauthenticated \u2014 backend/apps/hr/views.py:654"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-039612aa56fc2ef4", "name": "Django view `expense_categories` may be unauthenticated \u2014 backend/apps/expenses/views.py:44", "shortDescription": {"text": "Django view `expense_categories` may be unauthenticated \u2014 backend/apps/expenses/views.py:44"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b08cdcbea45a19cc", "name": "Django view `expense_summary` may be unauthenticated \u2014 backend/apps/expenses/views.py:50", "shortDescription": {"text": "Django view `expense_summary` may be unauthenticated \u2014 backend/apps/expenses/views.py:50"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ab953014095bffc3", "name": "Django view `create_sale` may be unauthenticated \u2014 backend/apps/sales/views.py:32", "shortDescription": {"text": "Django view `create_sale` may be unauthenticated \u2014 backend/apps/sales/views.py:32"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e5c0391d066a0c90", "name": "Django view `create_return` may be unauthenticated \u2014 backend/apps/sales/views.py:62", "shortDescription": {"text": "Django view `create_return` may be unauthenticated \u2014 backend/apps/sales/views.py:62"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bfc3b0dc329ccc24", "name": "DRF view `BranchListCreateView` declares no `permission_classes` \u2014 backend/apps/branches/views.py:9", "shortDescription": {"text": "DRF view `BranchListCreateView` declares no `permission_classes` \u2014 backend/apps/branches/views.py:9"}, "fullDescription": {"text": "DRF defaults to AllowAny when `permission_classes` is unset, exposing the endpoint publicly. Add `permission_classes = [IsAuthenticated]` (or stricter) at class level, or set `DEFAULT_PERMISSION_CLASSES` in settings."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-505ee7408fd843ed", "name": "DRF view `BranchDetailView` declares no `permission_classes` \u2014 backend/apps/branches/views.py:24", "shortDescription": {"text": "DRF view `BranchDetailView` declares no `permission_classes` \u2014 backend/apps/branches/views.py:24"}, "fullDescription": {"text": "DRF defaults to AllowAny when `permission_classes` is unset, exposing the endpoint publicly. Add `permission_classes = [IsAuthenticated]` (or stricter) at class level, or set `DEFAULT_PERMISSION_CLASSES` in settings."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7cf91c1df4bf74c6", "name": "Django view `dashboard_stats` may be unauthenticated \u2014 backend/apps/reports/views.py:93", "shortDescription": {"text": "Django view `dashboard_stats` may be unauthenticated \u2014 backend/apps/reports/views.py:93"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-234dab50f003796e", "name": "Django view `sales_report` may be unauthenticated \u2014 backend/apps/reports/views.py:569", "shortDescription": {"text": "Django view `sales_report` may be unauthenticated \u2014 backend/apps/reports/views.py:569"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5958be4ee40c2f06", "name": "Django view `top_products` may be unauthenticated \u2014 backend/apps/reports/views.py:640", "shortDescription": {"text": "Django view `top_products` may be unauthenticated \u2014 backend/apps/reports/views.py:640"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4422cc45411a3f5c", "name": "Django view `warranty_alerts` may be unauthenticated \u2014 backend/apps/reports/views.py:671", "shortDescription": {"text": "Django view `warranty_alerts` may be unauthenticated \u2014 backend/apps/reports/views.py:671"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c61ef5dad4d77247", "name": "Django view `non_moving_goods` may be unauthenticated \u2014 backend/apps/reports/views.py:695", "shortDescription": {"text": "Django view `non_moving_goods` may be unauthenticated \u2014 backend/apps/reports/views.py:695"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b7be037ef093618c", "name": "Django view `inventory_report` may be unauthenticated \u2014 backend/apps/reports/views.py:722", "shortDescription": {"text": "Django view `inventory_report` may be unauthenticated \u2014 backend/apps/reports/views.py:722"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4349a94c74c15b0c", "name": "Django view `profitability_report` may be unauthenticated \u2014 backend/apps/reports/views.py:810", "shortDescription": {"text": "Django view `profitability_report` may be unauthenticated \u2014 backend/apps/reports/views.py:810"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ae4eaa9a095688b", "name": "Django view `turnover_report` may be unauthenticated \u2014 backend/apps/reports/views.py:898", "shortDescription": {"text": "Django view `turnover_report` may be unauthenticated \u2014 backend/apps/reports/views.py:898"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f193377cdd0a687f", "name": "Django view `cashflow_report` may be unauthenticated \u2014 backend/apps/reports/views.py:1025", "shortDescription": {"text": "Django view `cashflow_report` may be unauthenticated \u2014 backend/apps/reports/views.py:1025"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f731521888d57a9c", "name": "Django view `branch_stats` may be unauthenticated \u2014 backend/apps/reports/views.py:1106", "shortDescription": {"text": "Django view `branch_stats` may be unauthenticated \u2014 backend/apps/reports/views.py:1106"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-af88a1217c5e1724", "name": "Django view `product_by_barcode` may be unauthenticated \u2014 backend/apps/products/views.py:114", "shortDescription": {"text": "Django view `product_by_barcode` may be unauthenticated \u2014 backend/apps/products/views.py:114"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-feb9199877759093", "name": "Django view `product_stock_history` may be unauthenticated \u2014 backend/apps/products/views.py:137", "shortDescription": {"text": "Django view `product_stock_history` may be unauthenticated \u2014 backend/apps/products/views.py:137"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-628d7cb21c50ef8e", "name": "Django view `product_barcode_image` may be unauthenticated \u2014 backend/apps/products/views.py:163", "shortDescription": {"text": "Django view `product_barcode_image` may be unauthenticated \u2014 backend/apps/products/views.py:163"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-24472a80ec6f3a55", "name": "Django view `upload_product_image` may be unauthenticated \u2014 backend/apps/products/views.py:183", "shortDescription": {"text": "Django view `upload_product_image` may be unauthenticated \u2014 backend/apps/products/views.py:183"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a494a965f186d8c7", "name": "Django view `delete_product_image` may be unauthenticated \u2014 backend/apps/products/views.py:231", "shortDescription": {"text": "Django view `delete_product_image` may be unauthenticated \u2014 backend/apps/products/views.py:231"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e9368ce16452f911", "name": "Django view `generate_barcode_for_product` may be unauthenticated \u2014 backend/apps/products/views.py:247", "shortDescription": {"text": "Django view `generate_barcode_for_product` may be unauthenticated \u2014 backend/apps/products/views.py:247"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-73ed8d822e84227e", "name": "Django view `print_labels_pdf` may be unauthenticated \u2014 backend/apps/products/views.py:290", "shortDescription": {"text": "Django view `print_labels_pdf` may be unauthenticated \u2014 backend/apps/products/views.py:290"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-68baa42593ca581f", "name": "Django view `inventory_count_items` may be unauthenticated \u2014 backend/apps/products/count_views.py:69", "shortDescription": {"text": "Django view `inventory_count_items` may be unauthenticated \u2014 backend/apps/products/count_views.py:69"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc60752d10936234", "name": "Django view `inventory_count_finalize` may be unauthenticated \u2014 backend/apps/products/count_views.py:108", "shortDescription": {"text": "Django view `inventory_count_finalize` may be unauthenticated \u2014 backend/apps/products/count_views.py:108"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b345941ea248e376", "name": "Django view `client_profile` may be unauthenticated \u2014 backend/apps/debts/views.py:55", "shortDescription": {"text": "Django view `client_profile` may be unauthenticated \u2014 backend/apps/debts/views.py:55"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-086ea9c832fa3497", "name": "Django view `record_payment` may be unauthenticated \u2014 backend/apps/debts/views.py:121", "shortDescription": {"text": "Django view `record_payment` may be unauthenticated \u2014 backend/apps/debts/views.py:121"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e07eeb6206ad3601", "name": "Django view `get_settings` may be unauthenticated \u2014 backend/apps/system_settings/views.py:15", "shortDescription": {"text": "Django view `get_settings` may be unauthenticated \u2014 backend/apps/system_settings/views.py:15"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f43ae920b1bcc14", "name": "Django view `update_settings` may be unauthenticated \u2014 backend/apps/system_settings/views.py:22", "shortDescription": {"text": "Django view `update_settings` may be unauthenticated \u2014 backend/apps/system_settings/views.py:22"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3e953eb00e2e5213", "name": "Django view `sync_ntp` may be unauthenticated \u2014 backend/apps/system_settings/views.py:33", "shortDescription": {"text": "Django view `sync_ntp` may be unauthenticated \u2014 backend/apps/system_settings/views.py:33"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-53c06122b49633dc", "name": "Django view `current_time` may be unauthenticated \u2014 backend/apps/system_settings/views.py:47", "shortDescription": {"text": "Django view `current_time` may be unauthenticated \u2014 backend/apps/system_settings/views.py:47"}, "fullDescription": {"text": "Function-view with `request` parameter has no `@login_required` or equivalent auth decorator within 5 lines above. If auth is enforced by middleware (`AUTHENTICATION_BACKENDS`), this is a false positive \u2014 dismiss with reason `by_design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7309bf2446873ccc", "name": "Unused endpoint: ANY /admin/", "shortDescription": {"text": "Unused endpoint: ANY /admin/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin/` 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-b861eb8177416b36", "name": "Unused endpoint: ANY /api/auth/", "shortDescription": {"text": "Unused endpoint: ANY /api/auth/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/auth/` 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-ef3b4cedc1e9850a", "name": "Unused endpoint: ANY /api/products/", "shortDescription": {"text": "Unused endpoint: ANY /api/products/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/products/` 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-cb8ab9a512ddc831", "name": "Unused endpoint: ANY /api/sales/", "shortDescription": {"text": "Unused endpoint: ANY /api/sales/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/sales/` 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-911491250405cad3", "name": "Unused endpoint: ANY /api/shifts/", "shortDescription": {"text": "Unused endpoint: ANY /api/shifts/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/shifts/` 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-2446b81993dd351f", "name": "Unused endpoint: ANY /api/debts/", "shortDescription": {"text": "Unused endpoint: ANY /api/debts/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/debts/` 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-a021123808ecb295", "name": "Unused endpoint: ANY /api/loyalty/", "shortDescription": {"text": "Unused endpoint: ANY /api/loyalty/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/loyalty/` 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-4df1fcdcfb2e05a4", "name": "Unused endpoint: ANY /api/reports/", "shortDescription": {"text": "Unused endpoint: ANY /api/reports/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/reports/` 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-72535bab05a50bba", "name": "Unused endpoint: ANY /api/services/", "shortDescription": {"text": "Unused endpoint: ANY /api/services/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/services/` 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-11fb3ddb5793f8f6", "name": "Unused endpoint: ANY /api/expenses/", "shortDescription": {"text": "Unused endpoint: ANY /api/expenses/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/expenses/` 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-fab911668069a797", "name": "Unused endpoint: ANY /api/telegram/", "shortDescription": {"text": "Unused endpoint: ANY /api/telegram/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/telegram/` 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-ad55299d74129fef", "name": "Unused endpoint: ANY /api/backup/", "shortDescription": {"text": "Unused endpoint: ANY /api/backup/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/backup/` 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-2297d4ea9a09794c", "name": "Unused endpoint: ANY /api/branches/", "shortDescription": {"text": "Unused endpoint: ANY /api/branches/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/branches/` 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-941087d3b994e2f8", "name": "Unused endpoint: ANY /api/hr/", "shortDescription": {"text": "Unused endpoint: ANY /api/hr/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/hr/` 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-c164b14c143274d8", "name": "Unused endpoint: ANY /api/printer/", "shortDescription": {"text": "Unused endpoint: ANY /api/printer/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/printer/` 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-ff8cc410fbe30ac2", "name": "Unused endpoint: ANY /api/broadcast/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/broadcast/` 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-4c937ee2de46460b", "name": "Unused endpoint: ANY /api/currency/", "shortDescription": {"text": "Unused endpoint: ANY /api/currency/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/currency/` 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-3f332ee96b2ae358", "name": "Unused endpoint: ANY /api/purchases/", "shortDescription": {"text": "Unused endpoint: ANY /api/purchases/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/purchases/` 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-e9a17834978cef33", "name": "Unused endpoint: ANY /api/notifications/", "shortDescription": {"text": "Unused endpoint: ANY /api/notifications/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/notifications/` 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-abe49b67d83a0776", "name": "Unused endpoint: ANY /api/system-settings/", "shortDescription": {"text": "Unused endpoint: ANY /api/system-settings/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/system-settings/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9afea21d9774a77e", "name": "Unused endpoint: ANY /api/tasks/", "shortDescription": {"text": "Unused endpoint: ANY /api/tasks/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/tasks/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a7ab6f136f143890", "name": "Unused endpoint: ANY /^media/(?P<path>.*)$", "shortDescription": {"text": "Unused endpoint: ANY /^media/(?P<path>.*)$"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /^media/(?P<path>.*)$` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36cdb7f9351bcef6", "name": "Unused endpoint: ANY /api/auth/login/", "shortDescription": {"text": "Unused endpoint: ANY /api/auth/login/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /api/auth/login/` 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-e0f4083d667c135a", "name": "Unused endpoint: ANY /api/auth/logout/", "shortDescription": {"text": "Unused endpoint: ANY /api/auth/logout/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /api/auth/logout/` 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-69f11e4f376a4fc2", "name": "Unused endpoint: ANY /api/auth/me/", "shortDescription": {"text": "Unused endpoint: ANY /api/auth/me/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /api/auth/me/` 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-02666adc63961ac7", "name": "Unused endpoint: ANY /api/auth/users/", "shortDescription": {"text": "Unused endpoint: ANY /api/auth/users/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /api/auth/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-fc564405ba607d65", "name": "Unused endpoint: ANY /api/auth/users/<int:pk>/", "shortDescription": {"text": "Unused endpoint: ANY /api/auth/users/<int:pk>/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /api/auth/users/<int:pk>/` 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-37127456d33e48fe", "name": "Unused endpoint: ANY /api/telegram/<str:bot_type>/", "shortDescription": {"text": "Unused endpoint: ANY /api/telegram/<str:bot_type>/"}, "fullDescription": {"text": "`backend/apps/telegram_settings/urls.py` declares `ANY /api/telegram/<str:bot_type>/` 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-9e201abe068a2977", "name": "Unused endpoint: ANY /api/telegram/<str:bot_type>/save/", "shortDescription": {"text": "Unused endpoint: ANY /api/telegram/<str:bot_type>/save/"}, "fullDescription": {"text": "`backend/apps/telegram_settings/urls.py` declares `ANY /api/telegram/<str:bot_type>/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-b64bba8ca15762be", "name": "Unused endpoint: ANY /api/telegram/<str:bot_type>/test/", "shortDescription": {"text": "Unused endpoint: ANY /api/telegram/<str:bot_type>/test/"}, "fullDescription": {"text": "`backend/apps/telegram_settings/urls.py` declares `ANY /api/telegram/<str:bot_type>/test/` 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-61985819285c8624", "name": "Unused endpoint: ANY /api/telegram/<str:bot_type>/toggle/", "shortDescription": {"text": "Unused endpoint: ANY /api/telegram/<str:bot_type>/toggle/"}, "fullDescription": {"text": "`backend/apps/telegram_settings/urls.py` declares `ANY /api/telegram/<str:bot_type>/toggle/` 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-b65d13248cc90edd", "name": "Unused endpoint: ANY /api/backup/create/", "shortDescription": {"text": "Unused endpoint: ANY /api/backup/create/"}, "fullDescription": {"text": "`backend/apps/backup/urls.py` declares `ANY /api/backup/create/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-173af64c42d7eb85", "name": "Unused endpoint: ANY /api/backup/<int:pk>/download/", "shortDescription": {"text": "Unused endpoint: ANY /api/backup/<int:pk>/download/"}, "fullDescription": {"text": "`backend/apps/backup/urls.py` declares `ANY /api/backup/<int:pk>/download/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-da08eb9395964e7e", "name": "Unused endpoint: ANY /api/backup/<int:pk>/delete/", "shortDescription": {"text": "Unused endpoint: ANY /api/backup/<int:pk>/delete/"}, "fullDescription": {"text": "`backend/apps/backup/urls.py` declares `ANY /api/backup/<int:pk>/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-a00df4abd5b566cd", "name": "Unused endpoint: ANY /api/backup/preview-import/", "shortDescription": {"text": "Unused endpoint: ANY /api/backup/preview-import/"}, "fullDescription": {"text": "`backend/apps/backup/urls.py` declares `ANY /api/backup/preview-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-a1b1c58f66c62a62", "name": "Unused endpoint: ANY /api/backup/import/", "shortDescription": {"text": "Unused endpoint: ANY /api/backup/import/"}, "fullDescription": {"text": "`backend/apps/backup/urls.py` declares `ANY /api/backup/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-cdafe33e18cf1b74", "name": "Unused endpoint: ANY /api/backup/available-models/", "shortDescription": {"text": "Unused endpoint: ANY /api/backup/available-models/"}, "fullDescription": {"text": "`backend/apps/backup/urls.py` declares `ANY /api/backup/available-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-d400fef6e9047871", "name": "Unused endpoint: ANY /api/loyalty/<int:pk>/", "shortDescription": {"text": "Unused endpoint: ANY /api/loyalty/<int:pk>/"}, "fullDescription": {"text": "`backend/apps/loyalty/urls.py` declares `ANY /api/loyalty/<int:pk>/` 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-024e49b139d1d865", "name": "Unused endpoint: ANY /api/loyalty/search/<str:card_number>/", "shortDescription": {"text": "Unused endpoint: ANY /api/loyalty/search/<str:card_number>/"}, "fullDescription": {"text": "`backend/apps/loyalty/urls.py` declares `ANY /api/loyalty/search/<str:card_number>/` 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-08de2a8766f3f561", "name": "Unused endpoint: ANY /api/loyalty/<int:pk>/adjust-bonus/", "shortDescription": {"text": "Unused endpoint: ANY /api/loyalty/<int:pk>/adjust-bonus/"}, "fullDescription": {"text": "`backend/apps/loyalty/urls.py` declares `ANY /api/loyalty/<int:pk>/adjust-bonus/` 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-ed122d0a205358b4", "name": "Unused endpoint: ANY /api/loyalty/transactions/", "shortDescription": {"text": "Unused endpoint: ANY /api/loyalty/transactions/"}, "fullDescription": {"text": "`backend/apps/loyalty/urls.py` declares `ANY /api/loyalty/transactions/` 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-17d9cd45cf718f7a", "name": "Unused endpoint: ANY /api/broadcast/templates/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/templates/"}, "fullDescription": {"text": "`backend/apps/telegram_broadcast/urls.py` declares `ANY /api/broadcast/templates/` 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-dcb3774eae197566", "name": "Unused endpoint: ANY /api/broadcast/templates/<int:pk>/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/templates/<int:pk>/"}, "fullDescription": {"text": "`backend/apps/telegram_broadcast/urls.py` declares `ANY /api/broadcast/templates/<int:pk>/` 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-f3d79fb98dbdf146", "name": "Unused endpoint: ANY /api/broadcast/<int:pk>/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/<int:pk>/"}, "fullDescription": {"text": "`backend/apps/telegram_broadcast/urls.py` declares `ANY /api/broadcast/<int:pk>/` 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-c77f31b0d0378add", "name": "Unused endpoint: ANY /api/broadcast/<int:pk>/recipients/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/<int:pk>/recipients/"}, "fullDescription": {"text": "`backend/apps/telegram_broadcast/urls.py` declares `ANY /api/broadcast/<int:pk>/recipients/` 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-2f555e6dd4db65b7", "name": "Unused endpoint: ANY /api/broadcast/<int:pk>/cancel/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/<int:pk>/cancel/"}, "fullDescription": {"text": "`backend/apps/telegram_broadcast/urls.py` declares `ANY /api/broadcast/<int:pk>/cancel/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2e29b685221e498", "name": "Unused endpoint: ANY /api/broadcast/<int:pk>/resend/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/<int:pk>/resend/"}, "fullDescription": {"text": "`backend/apps/telegram_broadcast/urls.py` declares `ANY /api/broadcast/<int:pk>/resend/` 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-3bfee6335f106698", "name": "Unused endpoint: ANY /api/broadcast/send/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/send/"}, "fullDescription": {"text": "`backend/apps/telegram_broadcast/urls.py` declares `ANY /api/broadcast/send/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4af8945b7e87e7e6", "name": "Unused endpoint: ANY /api/broadcast/individual/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/individual/"}, "fullDescription": {"text": "`backend/apps/telegram_broadcast/urls.py` declares `ANY /api/broadcast/individual/` 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-44a4944110913b6c", "name": "Unused endpoint: ANY /api/broadcast/schedule/", "shortDescription": {"text": "Unused endpoint: ANY /api/broadcast/schedule/"}, "fullDescription": {"text": "`backend/apps/telegram_broadcast/urls.py` declares `ANY /api/broadcast/schedule/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18821"}, "properties": {"repository": "samarqandy/sam-smart-pos", "repoUrl": "https://github.com/samarqandy/sam-smart-pos", "branch": "main"}, "results": [{"ruleId": "scanner-c3762f778922d211", "level": "note", "message": {"text": "Possibly dead Python function: emit"}, "properties": {"repobilityId": "fecc700ec874b669", "scanner": "scanner-primary", "fingerprint": "c3762f778922d211", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/config/error_notify.py:36"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-feaa608370a06e3e", "level": "note", "message": {"text": "Possibly dead Python function: fmt_date"}, "properties": {"repobilityId": "9c7e4daa17d30ec9", "scanner": "scanner-primary", "fingerprint": "feaa608370a06e3e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-208f73bfb9596737", "level": "note", "message": {"text": "Possibly dead Python function: cmd_start"}, "properties": {"repobilityId": "fc872c8259f0135a", "scanner": "scanner-primary", "fingerprint": "208f73bfb9596737", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:811"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7d1f71a1e33c4341", "level": "note", "message": {"text": "Possibly dead Python function: cmd_stats"}, "properties": {"repobilityId": "192d1822cd670340", "scanner": "scanner-primary", "fingerprint": "7d1f71a1e33c4341", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:830"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3142eeb6ed0a4298", "level": "note", "message": {"text": "Possibly dead Python function: cmd_low_stock"}, "properties": {"repobilityId": "139208bb848faec8", "scanner": "scanner-primary", "fingerprint": "3142eeb6ed0a4298", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:863"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8f20021a6c00df0f", "level": "note", "message": {"text": "Possibly dead Python function: cmd_debtors"}, "properties": {"repobilityId": "aeefbf839cb1a8dd", "scanner": "scanner-primary", "fingerprint": "8f20021a6c00df0f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:872"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-59bd4c5226f40937", "level": "note", "message": {"text": "Possibly dead Python function: cmd_sales"}, "properties": {"repobilityId": "e297c0456e43ceb0", "scanner": "scanner-primary", "fingerprint": "59bd4c5226f40937", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:881"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c8ea47e959be43d3", "level": "note", "message": {"text": "Possibly dead Python function: cmd_report"}, "properties": {"repobilityId": "e07177dc4040e77f", "scanner": "scanner-primary", "fingerprint": "c8ea47e959be43d3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:890"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-af58596a50a39065", "level": "note", "message": {"text": "Possibly dead Python function: cmd_tasks"}, "properties": {"repobilityId": "66cb4b39d84ce642", "scanner": "scanner-primary", "fingerprint": "af58596a50a39065", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:899"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-29ac46b58ccf572b", "level": "note", "message": {"text": "Possibly dead Python function: cb_tasks"}, "properties": {"repobilityId": "ba65329e2a64ffa7", "scanner": "scanner-primary", "fingerprint": "29ac46b58ccf572b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:909"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-22df7ee49ad4fb61", "level": "note", "message": {"text": "Possibly dead Python function: cb_stats"}, "properties": {"repobilityId": "4d26088c883b8fc6", "scanner": "scanner-primary", "fingerprint": "22df7ee49ad4fb61", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:930"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f6f2c167137c59f2", "level": "note", "message": {"text": "Possibly dead Python function: cb_lowstock"}, "properties": {"repobilityId": "1b3386de9fca2e00", "scanner": "scanner-primary", "fingerprint": "f6f2c167137c59f2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:971"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4fd768ce3b573458", "level": "note", "message": {"text": "Possibly dead Python function: cb_debtors"}, "properties": {"repobilityId": "47620bb5cc10b95c", "scanner": "scanner-primary", "fingerprint": "4fd768ce3b573458", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:985"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dcc39b7a636bfb3a", "level": "note", "message": {"text": "Possibly dead Python function: cb_goto"}, "properties": {"repobilityId": "b980ec5dda72d6fe", "scanner": "scanner-primary", "fingerprint": "dcc39b7a636bfb3a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:999"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2db783729305a916", "level": "note", "message": {"text": "Possibly dead Python function: cmd_employees"}, "properties": {"repobilityId": "26594d70498b9697", "scanner": "scanner-primary", "fingerprint": "2db783729305a916", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:1023"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-559e7e1592aa749d", "level": "note", "message": {"text": "Possibly dead Python function: cmd_employee"}, "properties": {"repobilityId": "cb9d07b145324a2a", "scanner": "scanner-primary", "fingerprint": "559e7e1592aa749d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:1044"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e39c3e98f8c0d99e", "level": "note", "message": {"text": "Possibly dead Python function: cb_employee"}, "properties": {"repobilityId": "0544677b4117c82a", "scanner": "scanner-primary", "fingerprint": "e39c3e98f8c0d99e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:1062"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-361a15af81721f74", "level": "note", "message": {"text": "Possibly dead Python function: cmd_broadcast"}, "properties": {"repobilityId": "02d7158c4f214f21", "scanner": "scanner-primary", "fingerprint": "361a15af81721f74", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py:1131"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-06cb8ef7f8466028", "level": "note", "message": {"text": "Possibly dead Python function: send_broadcast"}, "properties": {"repobilityId": "513d1c53f9b65abb", "scanner": "scanner-primary", "fingerprint": "06cb8ef7f8466028", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/broadcast_service.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-030a5eb3a2df505b", "level": "note", "message": {"text": "Possibly dead Python function: t"}, "properties": {"repobilityId": "cd0a46fede537361", "scanner": "scanner-primary", "fingerprint": "030a5eb3a2df505b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/i18n.py:114"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1c515d46e8d8fe1a", "level": "note", "message": {"text": "Possibly dead Python function: on_start_v2"}, "properties": {"repobilityId": "6fb5290c3eab0cee", "scanner": "scanner-primary", "fingerprint": "1c515d46e8d8fe1a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/master_bot.py:907"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7d0579983bded1be", "level": "note", "message": {"text": "Possibly dead Python function: cmd_tasks"}, "properties": {"repobilityId": "66cb4b39d84ce642", "scanner": "scanner-primary", "fingerprint": "7d0579983bded1be", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/master_bot.py:1603"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a03ec701d5b14013", "level": "note", "message": {"text": "Possibly dead Python function: callback_task_start"}, "properties": {"repobilityId": "d47057a30b91a581", "scanner": "scanner-primary", "fingerprint": "a03ec701d5b14013", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/master_bot.py:1621"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b348bd67ccf2351c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PaymentNumPad.jsx:60"}, "properties": {"repobilityId": "8aeea566b6e30ff5", "scanner": "scanner-primary", "fingerprint": "b348bd67ccf2351c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-492ae8a6fb3d3284", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/tasks/TaskDetailModal.jsx:101"}, "properties": {"repobilityId": "07073c7ae383b24f", "scanner": "scanner-primary", "fingerprint": "492ae8a6fb3d3284", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-ffb1b3ccb20705c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/TaskCard.jsx:71"}, "properties": {"repobilityId": "4efa3141eee864f9", "scanner": "scanner-primary", "fingerprint": "ffb1b3ccb20705c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5513320d1a106aba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/KanbanColumn.jsx:71"}, "properties": {"repobilityId": "385a061e5d90987d", "scanner": "scanner-primary", "fingerprint": "5513320d1a106aba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10fdb0b6e592a3bc", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/tasks/ColumnsConfigModal.jsx:59"}, "properties": {"repobilityId": "3ecde61ae9bc345a", "scanner": "scanner-primary", "fingerprint": "10fdb0b6e592a3bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-32b581da251c56aa", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/tasks/TaskFormModal.jsx:76"}, "properties": {"repobilityId": "c67ab41f99e80092", "scanner": "scanner-primary", "fingerprint": "32b581da251c56aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-bc2d0fde24e82f6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/TaskFormModal.jsx:181"}, "properties": {"repobilityId": "e61ad7206e9b6b43", "scanner": "scanner-primary", "fingerprint": "bc2d0fde24e82f6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23b3ae3d1a9a9f6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/tasks/TasksCustomers.jsx:75"}, "properties": {"repobilityId": "9cf785eb241af6f8", "scanner": "scanner-primary", "fingerprint": "23b3ae3d1a9a9f6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1630ed257a678123", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/AdminLayout.jsx:207"}, "properties": {"repobilityId": "43201ea8b1faf5dd", "scanner": "scanner-primary", "fingerprint": "1630ed257a678123", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-036f840383ff8edd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Reports.jsx:788"}, "properties": {"repobilityId": "66f0ebc8a8972b27", "scanner": "scanner-primary", "fingerprint": "036f840383ff8edd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33385278a3f737fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Expenses.jsx:328"}, "properties": {"repobilityId": "9c89ef902f4a3ace", "scanner": "scanner-primary", "fingerprint": "33385278a3f737fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7481e53a016e3671", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Leaves.jsx:242"}, "properties": {"repobilityId": "3de14028dde62db9", "scanner": "scanner-primary", "fingerprint": "7481e53a016e3671", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c4fa4086775ff31", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Dashboard.jsx:523"}, "properties": {"repobilityId": "4828f4b94bb52014", "scanner": "scanner-primary", "fingerprint": "6c4fa4086775ff31", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce62704a2a71f3f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/TelegramBroadcast.jsx:368"}, "properties": {"repobilityId": "da3c0b95450e5390", "scanner": "scanner-primary", "fingerprint": "ce62704a2a71f3f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b57b640bbdd4fcf7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/Employees.jsx:383"}, "properties": {"repobilityId": "124256a3a3b4e1c8", "scanner": "scanner-primary", "fingerprint": "b57b640bbdd4fcf7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76528256e130bf32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/inventory/StockTab.jsx:80"}, "properties": {"repobilityId": "9598208482398e34", "scanner": "scanner-primary", "fingerprint": "76528256e130bf32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61376d22c2f395b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/customers/DebtorsTab.jsx:145"}, "properties": {"repobilityId": "c2e4b558f7c453f6", "scanner": "scanner-primary", "fingerprint": "61376d22c2f395b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4983c781a96530de", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/sales/HistoryTab.jsx:216"}, "properties": {"repobilityId": "184cacb2aa9572c5", "scanner": "scanner-primary", "fingerprint": "4983c781a96530de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba22b3730c4ba884", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/products/ProductImportModal.jsx:306"}, "properties": {"repobilityId": "a88ba7270fd66fe0", "scanner": "scanner-primary", "fingerprint": "ba22b3730c4ba884", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6fceeb9bc004069e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/products/LabelsTab.jsx:272"}, "properties": {"repobilityId": "b1bddb05f551efb3", "scanner": "scanner-primary", "fingerprint": "6fceeb9bc004069e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea109966ff41c8d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/admin/products/ProductsTab.jsx:476"}, "properties": {"repobilityId": "6937283b36e7e85c", "scanner": "scanner-primary", "fingerprint": "ea109966ff41c8d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-325ad42452501274", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/pages/pos/POSPage.jsx:2054"}, "properties": {"repobilityId": "fcfe663a07cd1748", "scanner": "scanner-primary", "fingerprint": "325ad42452501274", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3820662cdc14efd1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/pos/POSPage.jsx:1617"}, "properties": {"repobilityId": "297ef8eb0b37c327", "scanner": "scanner-primary", "fingerprint": "3820662cdc14efd1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15fa60a01e1078d7", "level": "error", "message": {"text": "Possible secret in frontend/audit-shots.cjs"}, "properties": {"repobilityId": "08b4397febc45fb4", "scanner": "scanner-primary", "fingerprint": "15fa60a01e1078d7", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/audit-shots.cjs"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-37289f73c8ab18ad", "level": "error", "message": {"text": "Possible secret in frontend/labels-fname.cjs"}, "properties": {"repobilityId": "328ac7b228dd3388", "scanner": "scanner-primary", "fingerprint": "37289f73c8ab18ad", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/labels-fname.cjs"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-9d65fcf5c57d60ca", "level": "error", "message": {"text": "Possible secret in frontend/receipt-smoke.cjs"}, "properties": {"repobilityId": "35d6d7879d3af4b6", "scanner": "scanner-primary", "fingerprint": "9d65fcf5c57d60ca", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/receipt-smoke.cjs"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-7ff2ac6dfc03342b", "level": "error", "message": {"text": "Possible secret in frontend/labels-shots.cjs"}, "properties": {"repobilityId": "051d614f68661602", "scanner": "scanner-primary", "fingerprint": "7ff2ac6dfc03342b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/labels-shots.cjs"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-2fa6fcbb18b1e5f1", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/api/axios.js:28"}, "properties": {"repobilityId": "ba79a6dbd8aae2f8", "scanner": "scanner-primary", "fingerprint": "2fa6fcbb18b1e5f1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/axios.js"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-586bb5d8b4154692", "level": "note", "message": {"text": "Insecure pattern 'document_write' in frontend/src/components/receipt/ReceiptPrint.js:348"}, "properties": {"repobilityId": "f6caa12261517239", "scanner": "scanner-primary", "fingerprint": "586bb5d8b4154692", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/receipt/ReceiptPrint.js"}, "region": {"startLine": 348}}}]}, {"ruleId": "scanner-1ba1eafd409bc00a", "level": "note", "message": {"text": "Insecure pattern 'document_write' in frontend/src/pages/pos/POSPage.jsx:2677"}, "properties": {"repobilityId": "2ac18ea05800acb2", "scanner": "scanner-primary", "fingerprint": "1ba1eafd409bc00a", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/pos/POSPage.jsx"}, "region": {"startLine": 2677}}}]}, {"ruleId": "scanner-9af5b976c1f0d670", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/context/AuthContext.jsx:24"}, "properties": {"repobilityId": "f20cd8dd1d428075", "scanner": "scanner-primary", "fingerprint": "9af5b976c1f0d670", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/context/AuthContext.jsx"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-e233f0f77ff4f643", "level": "error", "message": {"text": "Possible secret in backend/apps/users/management/commands/seed_data.py"}, "properties": {"repobilityId": "3cff08d752bee749", "scanner": "scanner-primary", "fingerprint": "e233f0f77ff4f643", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/users/management/commands/seed_data.py"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-e233f0f77ff4f643", "level": "error", "message": {"text": "Possible secret in backend/apps/users/management/commands/seed_data.py"}, "properties": {"repobilityId": "3cff08d752bee749", "scanner": "scanner-primary", "fingerprint": "e233f0f77ff4f643", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/users/management/commands/seed_data.py"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6296dcc5d4095415", "level": "note", "message": {"text": "Very large file: frontend/src/pages/pos/POSPage.jsx (3229 lines)"}, "properties": {"repobilityId": "731f082fcc4d3120", "scanner": "scanner-primary", "fingerprint": "6296dcc5d4095415", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d85c0fb0c442a498", "level": "note", "message": {"text": "Very large file: backend/apps/telegram_broadcast/master_bot.py (1945 lines)"}, "properties": {"repobilityId": "a842459bfe5e94bb", "scanner": "scanner-primary", "fingerprint": "d85c0fb0c442a498", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "0b3c0490bcca187c", "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": "81ac6534af61c659", "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": "e9f558f8d5c03d52", "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": "077acb9f61844ca8", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "2a92a5c3e6c468ef", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "925aa8879766f0f2", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "a62cf6adfed628fe", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "3410d957f51e8474", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"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-15aadd63e2d32669", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/audit-shots.cjs:16"}, "properties": {"repobilityId": "e487725df5f041aa", "scanner": "scanner-primary", "fingerprint": "15aadd63e2d32669", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-81705c54511b0f49", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/receipt-smoke.cjs:27"}, "properties": {"repobilityId": "e315f608a76e56d7", "scanner": "scanner-primary", "fingerprint": "81705c54511b0f49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-81dc00b69b7d0e76", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/pos/POSPage.jsx:22"}, "properties": {"repobilityId": "3d7cda5fde57ce3f", "scanner": "scanner-primary", "fingerprint": "81dc00b69b7d0e76", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f856e22ba603e7c", "level": "note", "message": {"text": "Legacy-named symbol `create_backup` in backend/apps/backup/urls.py:6"}, "properties": {"repobilityId": "80e3843652ec9ed5", "scanner": "scanner-primary", "fingerprint": "9f856e22ba603e7c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6f4709c98d06ec42", "level": "note", "message": {"text": "Legacy-named symbol `create_backup` in backend/apps/backup/views.py:60"}, "properties": {"repobilityId": "ef1a7e1359a46751", "scanner": "scanner-primary", "fingerprint": "6f4709c98d06ec42", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e80052a9123252be", "level": "warning", "message": {"text": "Likely N+1 query: `for s in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/admin_bot.py:212"}, "properties": {"repobilityId": "2c397ed26c0a181b", "scanner": "scanner-primary", "fingerprint": "e80052a9123252be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py"}, "region": {"startLine": 212}}}]}, {"ruleId": "scanner-9be9f06d526054bb", "level": "warning", "message": {"text": "Likely N+1 query: `for col in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/admin_bot.py:282"}, "properties": {"repobilityId": "aabca2f852951b41", "scanner": "scanner-primary", "fingerprint": "9be9f06d526054bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py"}, "region": {"startLine": 282}}}]}, {"ruleId": "scanner-a870020248ab8c45", "level": "warning", "message": {"text": "Likely N+1 query: `for task in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/admin_bot.py:379"}, "properties": {"repobilityId": "58e6e4adbbf040d2", "scanner": "scanner-primary", "fingerprint": "a870020248ab8c45", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/admin_bot.py"}, "region": {"startLine": 379}}}]}, {"ruleId": "scanner-dbe02bd850bbf559", "level": "warning", "message": {"text": "Likely N+1 query: `for broadcast in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/apps.py:25"}, "properties": {"repobilityId": "87ab620173340149", "scanner": "scanner-primary", "fingerprint": "dbe02bd850bbf559", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/apps.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-8086aa3d74a7d968", "level": "note", "message": {"text": "Legacy-named symbol `on_start_v2` in backend/apps/telegram_broadcast/master_bot.py:907"}, "properties": {"repobilityId": "07acc40268df6267", "scanner": "scanner-primary", "fingerprint": "8086aa3d74a7d968", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-34cac441e7f73c1f", "level": "warning", "message": {"text": "Likely N+1 query: `for debtor in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/signals.py:129"}, "properties": {"repobilityId": "171084051c803ffe", "scanner": "scanner-primary", "fingerprint": "34cac441e7f73c1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/signals.py"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-8fa87b62474106f9", "level": "warning", "message": {"text": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:103"}, "properties": {"repobilityId": "92f1da2a113113c7", "scanner": "scanner-primary", "fingerprint": "8fa87b62474106f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/management/commands/runapscheduler.py"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-a2a2427a4cf45c14", "level": "warning", "message": {"text": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:106"}, "properties": {"repobilityId": "49a745f86f748d46", "scanner": "scanner-primary", "fingerprint": "a2a2427a4cf45c14", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/management/commands/runapscheduler.py"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-d4733061e4779c33", "level": "warning", "message": {"text": "Likely N+1 query: `for t in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:222"}, "properties": {"repobilityId": "492018153671c943", "scanner": "scanner-primary", "fingerprint": "d4733061e4779c33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/management/commands/runapscheduler.py"}, "region": {"startLine": 222}}}]}, {"ruleId": "scanner-9d4d532370c68571", "level": "warning", "message": {"text": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:270"}, "properties": {"repobilityId": "68d28cf1724ae92c", "scanner": "scanner-primary", "fingerprint": "9d4d532370c68571", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/management/commands/runapscheduler.py"}, "region": {"startLine": 270}}}]}, {"ruleId": "scanner-67110eae41dd0d4f", "level": "warning", "message": {"text": "Likely N+1 query: `for p in \u2026` triggers a query per row \u2014 backend/apps/telegram_broadcast/management/commands/runapscheduler.py:276"}, "properties": {"repobilityId": "254af170751ed0ac", "scanner": "scanner-primary", "fingerprint": "67110eae41dd0d4f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/management/commands/runapscheduler.py"}, "region": {"startLine": 276}}}]}, {"ruleId": "scanner-f1cd9b1ab1d016f0", "level": "note", "message": {"text": "Legacy-named symbol `done_old` in backend/apps/tasks/views.py:219"}, "properties": {"repobilityId": "d0fb2c4fc8686689", "scanner": "scanner-primary", "fingerprint": "f1cd9b1ab1d016f0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6750e2e8d1ea8a15", "level": "note", "message": {"text": "Legacy-named symbol `done_old` in backend/apps/tasks/management/commands/auto_archive_tasks.py:19"}, "properties": {"repobilityId": "d04e499e9c8dc144", "scanner": "scanner-primary", "fingerprint": "6750e2e8d1ea8a15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-481b96e0bf49057e", "level": "warning", "message": {"text": "Likely N+1 query: `for purchase in \u2026` triggers a query per row \u2014 backend/apps/purchases/analytics.py:117"}, "properties": {"repobilityId": "7f47ce38461b358c", "scanner": "scanner-primary", "fingerprint": "481b96e0bf49057e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/analytics.py"}, "region": {"startLine": 117}}}]}, {"ruleId": "scanner-e2016cfc47347d56", "level": "warning", "message": {"text": "Likely N+1 query: `for e in \u2026` triggers a query per row \u2014 backend/apps/hr/views.py:128"}, "properties": {"repobilityId": "c9aad0fa3943bf5a", "scanner": "scanner-primary", "fingerprint": "e2016cfc47347d56", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-99b62ebffed20cbc", "level": "note", "message": {"text": "Legacy-named symbol `position_old` in backend/apps/hr/migrations/0002_position_fk.py:27"}, "properties": {"repobilityId": "26fa54d9d0f738d5", "scanner": "scanner-primary", "fingerprint": "99b62ebffed20cbc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9e431705da7c446a", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/apps/sales/serializers.py:157"}, "properties": {"repobilityId": "cb6ebd5b8ce46954", "scanner": "scanner-primary", "fingerprint": "9e431705da7c446a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e631820dce76a0bc", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/apps/sales/migrations/0013_saleitem_cost_is_estimate.py:6"}, "properties": {"repobilityId": "ddd80000db063437", "scanner": "scanner-primary", "fingerprint": "e631820dce76a0bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-087c3dcaa2469b93", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/apps/reports/views.py:1015"}, "properties": {"repobilityId": "9939418714c448b0", "scanner": "scanner-primary", "fingerprint": "087c3dcaa2469b93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a0211618f4353f8", "level": "warning", "message": {"text": "Likely N+1 query: `for s in \u2026` triggers a query per row \u2014 backend/apps/reports/views.py:332"}, "properties": {"repobilityId": "762beecfff391c90", "scanner": "scanner-primary", "fingerprint": "3a0211618f4353f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 332}}}]}, {"ruleId": "scanner-09b1baa91feb772a", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/apps/products/serializers.py:49"}, "properties": {"repobilityId": "b7d73852775c884f", "scanner": "scanner-primary", "fingerprint": "09b1baa91feb772a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea5ef7078b879ac0", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/apps/products/barcode_service.py:325"}, "properties": {"repobilityId": "f108e04164282c7a", "scanner": "scanner-primary", "fingerprint": "ea5ef7078b879ac0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3741f48b4e962278", "level": "warning", "message": {"text": "Likely N+1 query: `for m in \u2026` triggers a query per row \u2014 backend/apps/products/views.py:147"}, "properties": {"repobilityId": "f96b520aefcff668", "scanner": "scanner-primary", "fingerprint": "3741f48b4e962278", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/views.py"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-77cffd23b2451291", "level": "warning", "message": {"text": "Likely N+1 query: `for cat in \u2026` triggers a query per row \u2014 backend/apps/products/management/commands/fix_categories.py:44"}, "properties": {"repobilityId": "ae12a2a4700bb8b9", "scanner": "scanner-primary", "fingerprint": "77cffd23b2451291", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/management/commands/fix_categories.py"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-68f04a53f412add7", "level": "warning", "message": {"text": "Likely N+1 query: `for model in \u2026` triggers a query per row \u2014 backend/apps/products/management/commands/find_orphan_movements.py:36"}, "properties": {"repobilityId": "c0923a322a3a20cf", "scanner": "scanner-primary", "fingerprint": "68f04a53f412add7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/management/commands/find_orphan_movements.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-a9b3a4d8161a2f10", "level": "note", "message": {"text": "Stub function `reverse_migrate` (body is just `pass`/`return`) \u2014 backend/apps/products/migrations/0007_dual_stock_fields.py:15"}, "properties": {"repobilityId": "1db103964d73deb0", "scanner": "scanner-primary", "fingerprint": "a9b3a4d8161a2f10", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-434f824f9f600a28", "level": "note", "message": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/apps/products/migrations/0012_backfill_balance_after.py:32"}, "properties": {"repobilityId": "13077aba5a8be6fd", "scanner": "scanner-primary", "fingerprint": "434f824f9f600a28", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-ee958e91955ae292", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/scripts/repair_2026_06_11_phase_d.py:3"}, "properties": {"repobilityId": "ce543dd5c5fa0f53", "scanner": "scanner-primary", "fingerprint": "ee958e91955ae292", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "78fec5cde7d27d03", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "cb5ee72c457bf6e8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "20e616c6680dc600", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "8277cfd113de1e8c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "415ce69973312cc8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "bc586cbb28956057", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "049b04087f75283b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "761e24269e746f7c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "9271c761a229577c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "e7b903ac3651f4a4", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "3913b6268e88314e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d7417643f93cb719", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "e2231ed61686241a", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d37e705e98047867", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "98deb6d387c4a1c6", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "40ef58c2a31f8655", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0225cf5916dfad3e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "72996343696870ec", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e318f5459f02ec29", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "5ff644ef9683a207", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-b010bca45b9a9f9d", "level": "warning", "message": {"text": "Frontend route `products` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0531eb9dd6ca6624", "scanner": "scanner-primary", "fingerprint": "b010bca45b9a9f9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3f9d3e8d9954fce1", "level": "warning", "message": {"text": "Frontend route `categories` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "adb1396b1b3fce9a", "scanner": "scanner-primary", "fingerprint": "3f9d3e8d9954fce1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4fa0179039497f03", "level": "warning", "message": {"text": "Frontend route `suppliers` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "4db974a682c209a4", "scanner": "scanner-primary", "fingerprint": "4fa0179039497f03", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0452765cfd151bc8", "level": "warning", "message": {"text": "Frontend route `services` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "7f81ea91415a4e92", "scanner": "scanner-primary", "fingerprint": "0452765cfd151bc8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-db8fd627e259dfdc", "level": "warning", "message": {"text": "Frontend route `inventory` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "c35a7b87c0b068b4", "scanner": "scanner-primary", "fingerprint": "db8fd627e259dfdc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-10fd23afe3a04750", "level": "warning", "message": {"text": "Frontend route `sales` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "18c25a06dcb920c8", "scanner": "scanner-primary", "fingerprint": "10fd23afe3a04750", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7ad013e7ccc633c8", "level": "warning", "message": {"text": "Frontend route `shifts` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "224e26d0ee75276f", "scanner": "scanner-primary", "fingerprint": "7ad013e7ccc633c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2cbd06316029c440", "level": "warning", "message": {"text": "Frontend route `customers` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "68cd32b25df60fb1", "scanner": "scanner-primary", "fingerprint": "2cbd06316029c440", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-27a0752649b3d062", "level": "warning", "message": {"text": "Frontend route `debtors` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "0da94cd25fcfab0b", "scanner": "scanner-primary", "fingerprint": "27a0752649b3d062", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-370187edf1060c6f", "level": "warning", "message": {"text": "Frontend route `loyalty` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "ef3b019977477cb7", "scanner": "scanner-primary", "fingerprint": "370187edf1060c6f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3f95a7341f0739b2", "level": "warning", "message": {"text": "Frontend route `reports` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "43877e526ba2945f", "scanner": "scanner-primary", "fingerprint": "3f95a7341f0739b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b51fd6b3e8caa47a", "level": "warning", "message": {"text": "Frontend route `expenses` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "2d8080272eac5f3d", "scanner": "scanner-primary", "fingerprint": "b51fd6b3e8caa47a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-28053f0e03b67196", "level": "warning", "message": {"text": "Frontend route `backup` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "74a029ee3a353ba1", "scanner": "scanner-primary", "fingerprint": "28053f0e03b67196", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9f71e47971e3a452", "level": "warning", "message": {"text": "Frontend route `hr` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "343fcc341edfc389", "scanner": "scanner-primary", "fingerprint": "9f71e47971e3a452", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3f0262c696be89cd", "level": "warning", "message": {"text": "Frontend route `employees` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "f00bbc236b300bc1", "scanner": "scanner-primary", "fingerprint": "3f0262c696be89cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fce476cb2e9138c1", "level": "warning", "message": {"text": "Frontend route `timesheet` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "e68e6f2ff66f3973", "scanner": "scanner-primary", "fingerprint": "fce476cb2e9138c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7b2dd3a3c6df6c2b", "level": "warning", "message": {"text": "Frontend route `payroll` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "4d26d44fea396cd1", "scanner": "scanner-primary", "fingerprint": "7b2dd3a3c6df6c2b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-933318194cfc7fcf", "level": "warning", "message": {"text": "Frontend route `leaves` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "5a07e67db1dabc46", "scanner": "scanner-primary", "fingerprint": "933318194cfc7fcf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4c41903228663ce9", "level": "warning", "message": {"text": "Frontend route `hr-reports` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "dc247fce8b054cfb", "scanner": "scanner-primary", "fingerprint": "4c41903228663ce9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-51b1524af6894435", "level": "warning", "message": {"text": "Frontend route `print-labels` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "e079bb26d454fd72", "scanner": "scanner-primary", "fingerprint": "51b1524af6894435", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-832383f51e14d302", "level": "warning", "message": {"text": "Frontend route `broadcast` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "9f16dc1934cd77ce", "scanner": "scanner-primary", "fingerprint": "832383f51e14d302", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-93008a33ae7ad7cb", "level": "warning", "message": {"text": "Frontend route `purchases` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "c658d80793682faf", "scanner": "scanner-primary", "fingerprint": "93008a33ae7ad7cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c66ebbcde4f320e2", "level": "warning", "message": {"text": "Frontend route `purchases/analytics` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "25072a472b447e34", "scanner": "scanner-primary", "fingerprint": "c66ebbcde4f320e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f4859238d70b32ea", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "1eef5bc4ce3b8368", "scanner": "scanner-primary", "fingerprint": "f4859238d70b32ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d93bfbb18dd1830d", "level": "warning", "message": {"text": "Frontend route `system-settings` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "64e5a91bda903ffa", "scanner": "scanner-primary", "fingerprint": "d93bfbb18dd1830d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-229dcd58222f8cc9", "level": "warning", "message": {"text": "Frontend route `users` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "93da2778b4fba156", "scanner": "scanner-primary", "fingerprint": "229dcd58222f8cc9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3a5a72474e32fdd2", "level": "warning", "message": {"text": "Frontend route `branches` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "03868f4a3cca56bd", "scanner": "scanner-primary", "fingerprint": "3a5a72474e32fdd2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7004d2be6da1176d", "level": "warning", "message": {"text": "Frontend route `telegram` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "a40d808542ab95d4", "scanner": "scanner-primary", "fingerprint": "7004d2be6da1176d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-aabcf0d74bb29637", "level": "warning", "message": {"text": "Frontend route `printer` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "77066d02ad4983c4", "scanner": "scanner-primary", "fingerprint": "aabcf0d74bb29637", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-243d32e552314142", "level": "warning", "message": {"text": "Frontend route `currency` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "db9fad8455a2377c", "scanner": "scanner-primary", "fingerprint": "243d32e552314142", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-17c1da10335b1177", "level": "warning", "message": {"text": "Frontend route `tasks` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "44762965842f9d69", "scanner": "scanner-primary", "fingerprint": "17c1da10335b1177", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5fbd72bb948d6cc2", "level": "warning", "message": {"text": "Django CBV `CustomTokenObtainPairView` lacks `LoginRequiredMixin` \u2014 backend/apps/users/views.py:12"}, "properties": {"repobilityId": "5ee33985bfa89dbf", "scanner": "scanner-primary", "fingerprint": "5fbd72bb948d6cc2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/users/views.py"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-244ce1865bcc2688", "level": "warning", "message": {"text": "Django view `save_bot` may be unauthenticated \u2014 backend/apps/telegram_settings/views.py:25"}, "properties": {"repobilityId": "160fe7fa82a14b2e", "scanner": "scanner-primary", "fingerprint": "244ce1865bcc2688", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_settings/views.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-c3caf1f6a24515b9", "level": "warning", "message": {"text": "Django view `toggle_bot` may be unauthenticated \u2014 backend/apps/telegram_settings/views.py:77"}, "properties": {"repobilityId": "00be2595e9d0dc71", "scanner": "scanner-primary", "fingerprint": "c3caf1f6a24515b9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_settings/views.py"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-5449bc23c69ec682", "level": "warning", "message": {"text": "Django view `create_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:60"}, "properties": {"repobilityId": "76b5bfb1774a6612", "scanner": "scanner-primary", "fingerprint": "5449bc23c69ec682", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/backup/views.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-a799161a7f585307", "level": "warning", "message": {"text": "Django view `list_backups` may be unauthenticated \u2014 backend/apps/backup/views.py:116"}, "properties": {"repobilityId": "4561e597396684d5", "scanner": "scanner-primary", "fingerprint": "a799161a7f585307", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/backup/views.py"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-74d628c517aa5c1a", "level": "warning", "message": {"text": "Django view `download_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:134"}, "properties": {"repobilityId": "1d0711566e4b14a0", "scanner": "scanner-primary", "fingerprint": "74d628c517aa5c1a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/backup/views.py"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-3d1b8d5ce0711e88", "level": "warning", "message": {"text": "Django view `delete_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:151"}, "properties": {"repobilityId": "8765b5bd3674a2e1", "scanner": "scanner-primary", "fingerprint": "3d1b8d5ce0711e88", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/backup/views.py"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-c176473928080def", "level": "warning", "message": {"text": "Django view `preview_import` may be unauthenticated \u2014 backend/apps/backup/views.py:167"}, "properties": {"repobilityId": "bcab60fb1b77f7d3", "scanner": "scanner-primary", "fingerprint": "c176473928080def", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/backup/views.py"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-32f8061e68561a5b", "level": "warning", "message": {"text": "Django view `import_backup` may be unauthenticated \u2014 backend/apps/backup/views.py:188"}, "properties": {"repobilityId": "dad6ff724152e407", "scanner": "scanner-primary", "fingerprint": "32f8061e68561a5b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/backup/views.py"}, "region": {"startLine": 188}}}]}, {"ruleId": "scanner-f8b9fde834baef2a", "level": "warning", "message": {"text": "Django view `available_models` may be unauthenticated \u2014 backend/apps/backup/views.py:286"}, "properties": {"repobilityId": "b3e17e4aae398da7", "scanner": "scanner-primary", "fingerprint": "f8b9fde834baef2a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/backup/views.py"}, "region": {"startLine": 286}}}]}, {"ruleId": "scanner-a1a1dc43417b64d3", "level": "warning", "message": {"text": "Django view `card_by_number` may be unauthenticated \u2014 backend/apps/loyalty/views.py:30"}, "properties": {"repobilityId": "c969910e1e8cc9e0", "scanner": "scanner-primary", "fingerprint": "a1a1dc43417b64d3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/loyalty/views.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-6961d56d7ce62667", "level": "warning", "message": {"text": "Django view `adjust_bonus` may be unauthenticated \u2014 backend/apps/loyalty/views.py:40"}, "properties": {"repobilityId": "9ec6860208502471", "scanner": "scanner-primary", "fingerprint": "6961d56d7ce62667", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/loyalty/views.py"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-bb0995346dfdfe70", "level": "warning", "message": {"text": "Django view `broadcast_recipients_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:37"}, "properties": {"repobilityId": "4572e6c0a65b5682", "scanner": "scanner-primary", "fingerprint": "bb0995346dfdfe70", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/views.py"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-7ecddf18a2e93817", "level": "warning", "message": {"text": "Django view `send_now_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:47"}, "properties": {"repobilityId": "610e582aeec797ba", "scanner": "scanner-primary", "fingerprint": "7ecddf18a2e93817", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/views.py"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-12aeffb186bc9e14", "level": "warning", "message": {"text": "Django view `individual_send_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:78"}, "properties": {"repobilityId": "d26ea47af08dd24c", "scanner": "scanner-primary", "fingerprint": "12aeffb186bc9e14", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/views.py"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-9cd2a8f44493c4b1", "level": "warning", "message": {"text": "Django view `schedule_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:98"}, "properties": {"repobilityId": "4ddf36840a25080c", "scanner": "scanner-primary", "fingerprint": "9cd2a8f44493c4b1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/views.py"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-c15c0739e7a7ff2f", "level": "warning", "message": {"text": "Django view `cancel_broadcast_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:133"}, "properties": {"repobilityId": "59594c6da79b2d41", "scanner": "scanner-primary", "fingerprint": "c15c0739e7a7ff2f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/views.py"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-8d11ef26ff4feeaf", "level": "warning", "message": {"text": "Django view `resend_broadcast_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:145"}, "properties": {"repobilityId": "4147036e3aab5645", "scanner": "scanner-primary", "fingerprint": "8d11ef26ff4feeaf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/views.py"}, "region": {"startLine": 145}}}]}, {"ruleId": "scanner-334d46c14e91dd18", "level": "warning", "message": {"text": "Django view `recipient_count_view` may be unauthenticated \u2014 backend/apps/telegram_broadcast/views.py:165"}, "properties": {"repobilityId": "d1232e4cfcef1c19", "scanner": "scanner-primary", "fingerprint": "334d46c14e91dd18", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/telegram_broadcast/views.py"}, "region": {"startLine": 165}}}]}, {"ruleId": "scanner-654d021558242eec", "level": "warning", "message": {"text": "Django view `print_receipt_view` may be unauthenticated \u2014 backend/apps/printer/views.py:32"}, "properties": {"repobilityId": "c51d9180f9d0c98f", "scanner": "scanner-primary", "fingerprint": "654d021558242eec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/printer/views.py"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-9d08f56b3b1d4e20", "level": "warning", "message": {"text": "Django view `printer_status_view` may be unauthenticated \u2014 backend/apps/printer/views.py:89"}, "properties": {"repobilityId": "9b245b3344cc074e", "scanner": "scanner-primary", "fingerprint": "9d08f56b3b1d4e20", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/printer/views.py"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-7cc14d97bf43b51f", "level": "warning", "message": {"text": "Django view `pay_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:48"}, "properties": {"repobilityId": "20e9d441d589189c", "scanner": "scanner-primary", "fingerprint": "7cc14d97bf43b51f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/views.py"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-72756c689aebbed8", "level": "warning", "message": {"text": "Django view `payments_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:107"}, "properties": {"repobilityId": "64c6ffdfd3d0f99e", "scanner": "scanner-primary", "fingerprint": "72756c689aebbed8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/views.py"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-ed49b99db64eb794", "level": "warning", "message": {"text": "Django view `overdue_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:127"}, "properties": {"repobilityId": "36ea6de73d92520f", "scanner": "scanner-primary", "fingerprint": "ed49b99db64eb794", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/views.py"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-18e5fabd57f06fbe", "level": "warning", "message": {"text": "Django view `upcoming_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:134"}, "properties": {"repobilityId": "8fcd161cdb0dd029", "scanner": "scanner-primary", "fingerprint": "18e5fabd57f06fbe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/views.py"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-fbe616654c7c5fcf", "level": "warning", "message": {"text": "Django view `summary_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:148"}, "properties": {"repobilityId": "f519486732eb5fa2", "scanner": "scanner-primary", "fingerprint": "fbe616654c7c5fcf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/views.py"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-d53cca166c4b38a4", "level": "warning", "message": {"text": "Django view `analytics_view` may be unauthenticated \u2014 backend/apps/purchases/views.py:169"}, "properties": {"repobilityId": "733b89820a6568b7", "scanner": "scanner-primary", "fingerprint": "d53cca166c4b38a4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/views.py"}, "region": {"startLine": 169}}}]}, {"ruleId": "scanner-5f753478f0976ed0", "level": "warning", "message": {"text": "Django view `notifications_list` may be unauthenticated \u2014 backend/apps/purchases/views.py:178"}, "properties": {"repobilityId": "05c01f625f53dc9f", "scanner": "scanner-primary", "fingerprint": "5f753478f0976ed0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/views.py"}, "region": {"startLine": 178}}}]}, {"ruleId": "scanner-38a4915367fd12e5", "level": "warning", "message": {"text": "Django view `notification_read` may be unauthenticated \u2014 backend/apps/purchases/views.py:189"}, "properties": {"repobilityId": "d1cc550e034db15e", "scanner": "scanner-primary", "fingerprint": "38a4915367fd12e5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/views.py"}, "region": {"startLine": 189}}}]}, {"ruleId": "scanner-a3ab346f7410c668", "level": "warning", "message": {"text": "Django view `notification_read_all` may be unauthenticated \u2014 backend/apps/purchases/views.py:201"}, "properties": {"repobilityId": "68a7bf2d9c02bc1b", "scanner": "scanner-primary", "fingerprint": "a3ab346f7410c668", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/purchases/views.py"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-d742ed29a4f9a4ea", "level": "warning", "message": {"text": "Django view `open_shift` may be unauthenticated \u2014 backend/apps/shifts/views.py:58"}, "properties": {"repobilityId": "707896ea02c64adc", "scanner": "scanner-primary", "fingerprint": "d742ed29a4f9a4ea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/shifts/views.py"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-72f1dd5b63ce59e5", "level": "warning", "message": {"text": "Django view `close_shift` may be unauthenticated \u2014 backend/apps/shifts/views.py:72"}, "properties": {"repobilityId": "9de41ca3befb6b3f", "scanner": "scanner-primary", "fingerprint": "72f1dd5b63ce59e5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/shifts/views.py"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-0949bf375f1ebd67", "level": "warning", "message": {"text": "Django view `current_shift` may be unauthenticated \u2014 backend/apps/shifts/views.py:91"}, "properties": {"repobilityId": "7a2e95c09c01bf01", "scanner": "scanner-primary", "fingerprint": "0949bf375f1ebd67", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/shifts/views.py"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-8db1c5f1bc5e184e", "level": "warning", "message": {"text": "Django view `shift_live_stats` may be unauthenticated \u2014 backend/apps/shifts/views.py:148"}, "properties": {"repobilityId": "48933d6d3a97468f", "scanner": "scanner-primary", "fingerprint": "8db1c5f1bc5e184e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/shifts/views.py"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-d93c3dbbd3a4410c", "level": "warning", "message": {"text": "Django view `current_shift_stats` may be unauthenticated \u2014 backend/apps/shifts/views.py:194"}, "properties": {"repobilityId": "dcd5d536d647dc67", "scanner": "scanner-primary", "fingerprint": "d93c3dbbd3a4410c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/shifts/views.py"}, "region": {"startLine": 194}}}]}, {"ruleId": "scanner-b01b0f4234877874", "level": "warning", "message": {"text": "Django view `rates_view` may be unauthenticated \u2014 backend/apps/currency/views.py:12"}, "properties": {"repobilityId": "afff635a7cc286a7", "scanner": "scanner-primary", "fingerprint": "b01b0f4234877874", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/currency/views.py"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-8a27f5dde30caf64", "level": "warning", "message": {"text": "Django view `fetch_from_cbu` may be unauthenticated \u2014 backend/apps/currency/views.py:54"}, "properties": {"repobilityId": "f01d2e9064199eb5", "scanner": "scanner-primary", "fingerprint": "8a27f5dde30caf64", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/currency/views.py"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-1b066990c016acc9", "level": "warning", "message": {"text": "Django view `rate_history` may be unauthenticated \u2014 backend/apps/currency/views.py:66"}, "properties": {"repobilityId": "4f9ef1dc273c8cdf", "scanner": "scanner-primary", "fingerprint": "1b066990c016acc9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/currency/views.py"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-bfc743db62b77965", "level": "warning", "message": {"text": "Django view `timesheet_month` may be unauthenticated \u2014 backend/apps/hr/views.py:104"}, "properties": {"repobilityId": "3eee212c409ecece", "scanner": "scanner-primary", "fingerprint": "bfc743db62b77965", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-888b283ad65c60b8", "level": "warning", "message": {"text": "Django view `timesheet_set_entry` may be unauthenticated \u2014 backend/apps/hr/views.py:174"}, "properties": {"repobilityId": "c302b0f3e568eea1", "scanner": "scanner-primary", "fingerprint": "888b283ad65c60b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-9666ddd4eeda59bf", "level": "warning", "message": {"text": "Django view `timesheet_delete_entry` may be unauthenticated \u2014 backend/apps/hr/views.py:208"}, "properties": {"repobilityId": "06bbd2ff461eadd3", "scanner": "scanner-primary", "fingerprint": "9666ddd4eeda59bf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 208}}}]}, {"ruleId": "scanner-6ce8e5ccb11c7144", "level": "warning", "message": {"text": "Django view `payroll_month` may be unauthenticated \u2014 backend/apps/hr/views.py:221"}, "properties": {"repobilityId": "375251878b2929b6", "scanner": "scanner-primary", "fingerprint": "6ce8e5ccb11c7144", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 221}}}]}, {"ruleId": "scanner-b53d25a4d955e5d9", "level": "warning", "message": {"text": "Django view `payroll_calculate` may be unauthenticated \u2014 backend/apps/hr/views.py:238"}, "properties": {"repobilityId": "d1b1a8b231b0ba9a", "scanner": "scanner-primary", "fingerprint": "b53d25a4d955e5d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 238}}}]}, {"ruleId": "scanner-6993f9c320dfb2ea", "level": "warning", "message": {"text": "Django view `payroll_calculate_one` may be unauthenticated \u2014 backend/apps/hr/views.py:308"}, "properties": {"repobilityId": "0cada410ba48b73e", "scanner": "scanner-primary", "fingerprint": "6993f9c320dfb2ea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 308}}}]}, {"ruleId": "scanner-c4cbe14b98793912", "level": "warning", "message": {"text": "Django view `payroll_update` may be unauthenticated \u2014 backend/apps/hr/views.py:348"}, "properties": {"repobilityId": "059efdcd2ee15d0d", "scanner": "scanner-primary", "fingerprint": "c4cbe14b98793912", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 348}}}]}, {"ruleId": "scanner-fe56f9ecc0be286d", "level": "warning", "message": {"text": "Django view `leave_approve` may be unauthenticated \u2014 backend/apps/hr/views.py:428"}, "properties": {"repobilityId": "d0a5b22f09ebc416", "scanner": "scanner-primary", "fingerprint": "fe56f9ecc0be286d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 428}}}]}, {"ruleId": "scanner-b0504dbfe0836032", "level": "warning", "message": {"text": "Django view `leave_reject` may be unauthenticated \u2014 backend/apps/hr/views.py:442"}, "properties": {"repobilityId": "8a0ea45a58ad573e", "scanner": "scanner-primary", "fingerprint": "b0504dbfe0836032", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 442}}}]}, {"ruleId": "scanner-11d166bb7a407ead", "level": "warning", "message": {"text": "Django view `leave_balance` may be unauthenticated \u2014 backend/apps/hr/views.py:456"}, "properties": {"repobilityId": "484b4b7e45aaf3a1", "scanner": "scanner-primary", "fingerprint": "11d166bb7a407ead", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 456}}}]}, {"ruleId": "scanner-1c66151a2b10d4e4", "level": "warning", "message": {"text": "Django view `hr_report_payroll_sheet` may be unauthenticated \u2014 backend/apps/hr/views.py:492"}, "properties": {"repobilityId": "6fa9d085717659ea", "scanner": "scanner-primary", "fingerprint": "1c66151a2b10d4e4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 492}}}]}, {"ruleId": "scanner-90d8e410b0416acd", "level": "warning", "message": {"text": "Django view `hr_report_salary_trend` may be unauthenticated \u2014 backend/apps/hr/views.py:529"}, "properties": {"repobilityId": "cfe72f307874bb32", "scanner": "scanner-primary", "fingerprint": "90d8e410b0416acd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 529}}}]}, {"ruleId": "scanner-62074d2afbdcf4bc", "level": "warning", "message": {"text": "Django view `hr_report_top_hours` may be unauthenticated \u2014 backend/apps/hr/views.py:552"}, "properties": {"repobilityId": "9c986ee7d78176cd", "scanner": "scanner-primary", "fingerprint": "62074d2afbdcf4bc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 552}}}]}, {"ruleId": "scanner-d33aa7bd083abc57", "level": "warning", "message": {"text": "Django view `generate_telegram_invite` may be unauthenticated \u2014 backend/apps/hr/views.py:575"}, "properties": {"repobilityId": "ee68764ed6add2c6", "scanner": "scanner-primary", "fingerprint": "d33aa7bd083abc57", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 575}}}]}, {"ruleId": "scanner-a91d4fde1dd534b8", "level": "warning", "message": {"text": "Django view `bot_info` may be unauthenticated \u2014 backend/apps/hr/views.py:608"}, "properties": {"repobilityId": "b8d7d1355427a874", "scanner": "scanner-primary", "fingerprint": "a91d4fde1dd534b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 608}}}]}, {"ruleId": "scanner-2dfc27a3b1ed9ddb", "level": "warning", "message": {"text": "Django view `delete_invite` may be unauthenticated \u2014 backend/apps/hr/views.py:623"}, "properties": {"repobilityId": "431474fbdb0977d0", "scanner": "scanner-primary", "fingerprint": "2dfc27a3b1ed9ddb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 623}}}]}, {"ruleId": "scanner-b31f9b791ee2451b", "level": "warning", "message": {"text": "Django view `unlink_telegram` may be unauthenticated \u2014 backend/apps/hr/views.py:638"}, "properties": {"repobilityId": "2f53b87ad6799533", "scanner": "scanner-primary", "fingerprint": "b31f9b791ee2451b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 638}}}]}, {"ruleId": "scanner-56de8e1661825c91", "level": "warning", "message": {"text": "Django view `hr_choices` may be unauthenticated \u2014 backend/apps/hr/views.py:654"}, "properties": {"repobilityId": "f32fd645aebe0c94", "scanner": "scanner-primary", "fingerprint": "56de8e1661825c91", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/hr/views.py"}, "region": {"startLine": 654}}}]}, {"ruleId": "scanner-039612aa56fc2ef4", "level": "warning", "message": {"text": "Django view `expense_categories` may be unauthenticated \u2014 backend/apps/expenses/views.py:44"}, "properties": {"repobilityId": "773cc473b50efcbd", "scanner": "scanner-primary", "fingerprint": "039612aa56fc2ef4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/expenses/views.py"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-b08cdcbea45a19cc", "level": "warning", "message": {"text": "Django view `expense_summary` may be unauthenticated \u2014 backend/apps/expenses/views.py:50"}, "properties": {"repobilityId": "97c506adc76b7666", "scanner": "scanner-primary", "fingerprint": "b08cdcbea45a19cc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/expenses/views.py"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-ab953014095bffc3", "level": "warning", "message": {"text": "Django view `create_sale` may be unauthenticated \u2014 backend/apps/sales/views.py:32"}, "properties": {"repobilityId": "9fe472bebedc6f5a", "scanner": "scanner-primary", "fingerprint": "ab953014095bffc3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/sales/views.py"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-e5c0391d066a0c90", "level": "warning", "message": {"text": "Django view `create_return` may be unauthenticated \u2014 backend/apps/sales/views.py:62"}, "properties": {"repobilityId": "48c8b4b1cd76cd3f", "scanner": "scanner-primary", "fingerprint": "e5c0391d066a0c90", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/sales/views.py"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-bfc3b0dc329ccc24", "level": "error", "message": {"text": "DRF view `BranchListCreateView` declares no `permission_classes` \u2014 backend/apps/branches/views.py:9"}, "properties": {"repobilityId": "63ee381b51bebff0", "scanner": "scanner-primary", "fingerprint": "bfc3b0dc329ccc24", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/branches/views.py"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-505ee7408fd843ed", "level": "error", "message": {"text": "DRF view `BranchDetailView` declares no `permission_classes` \u2014 backend/apps/branches/views.py:24"}, "properties": {"repobilityId": "713d180185b3a408", "scanner": "scanner-primary", "fingerprint": "505ee7408fd843ed", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/branches/views.py"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-7cf91c1df4bf74c6", "level": "warning", "message": {"text": "Django view `dashboard_stats` may be unauthenticated \u2014 backend/apps/reports/views.py:93"}, "properties": {"repobilityId": "676b309908132a40", "scanner": "scanner-primary", "fingerprint": "7cf91c1df4bf74c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 93}}}]}, {"ruleId": "scanner-234dab50f003796e", "level": "warning", "message": {"text": "Django view `sales_report` may be unauthenticated \u2014 backend/apps/reports/views.py:569"}, "properties": {"repobilityId": "b9783737bb50891f", "scanner": "scanner-primary", "fingerprint": "234dab50f003796e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 569}}}]}, {"ruleId": "scanner-5958be4ee40c2f06", "level": "warning", "message": {"text": "Django view `top_products` may be unauthenticated \u2014 backend/apps/reports/views.py:640"}, "properties": {"repobilityId": "51c3a84b8354cc60", "scanner": "scanner-primary", "fingerprint": "5958be4ee40c2f06", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 640}}}]}, {"ruleId": "scanner-4422cc45411a3f5c", "level": "warning", "message": {"text": "Django view `warranty_alerts` may be unauthenticated \u2014 backend/apps/reports/views.py:671"}, "properties": {"repobilityId": "9df94e7facb3bff2", "scanner": "scanner-primary", "fingerprint": "4422cc45411a3f5c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 671}}}]}, {"ruleId": "scanner-c61ef5dad4d77247", "level": "warning", "message": {"text": "Django view `non_moving_goods` may be unauthenticated \u2014 backend/apps/reports/views.py:695"}, "properties": {"repobilityId": "6208460545bfeee0", "scanner": "scanner-primary", "fingerprint": "c61ef5dad4d77247", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 695}}}]}, {"ruleId": "scanner-b7be037ef093618c", "level": "warning", "message": {"text": "Django view `inventory_report` may be unauthenticated \u2014 backend/apps/reports/views.py:722"}, "properties": {"repobilityId": "b7b27d179f8ac7a1", "scanner": "scanner-primary", "fingerprint": "b7be037ef093618c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 722}}}]}, {"ruleId": "scanner-4349a94c74c15b0c", "level": "warning", "message": {"text": "Django view `profitability_report` may be unauthenticated \u2014 backend/apps/reports/views.py:810"}, "properties": {"repobilityId": "36df4f3e5ccb9562", "scanner": "scanner-primary", "fingerprint": "4349a94c74c15b0c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 810}}}]}, {"ruleId": "scanner-8ae4eaa9a095688b", "level": "warning", "message": {"text": "Django view `turnover_report` may be unauthenticated \u2014 backend/apps/reports/views.py:898"}, "properties": {"repobilityId": "b935e0802d1f6575", "scanner": "scanner-primary", "fingerprint": "8ae4eaa9a095688b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 898}}}]}, {"ruleId": "scanner-f193377cdd0a687f", "level": "warning", "message": {"text": "Django view `cashflow_report` may be unauthenticated \u2014 backend/apps/reports/views.py:1025"}, "properties": {"repobilityId": "e6af3523d0419b88", "scanner": "scanner-primary", "fingerprint": "f193377cdd0a687f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 1025}}}]}, {"ruleId": "scanner-f731521888d57a9c", "level": "warning", "message": {"text": "Django view `branch_stats` may be unauthenticated \u2014 backend/apps/reports/views.py:1106"}, "properties": {"repobilityId": "caffc89010975ddb", "scanner": "scanner-primary", "fingerprint": "f731521888d57a9c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/reports/views.py"}, "region": {"startLine": 1106}}}]}, {"ruleId": "scanner-af88a1217c5e1724", "level": "warning", "message": {"text": "Django view `product_by_barcode` may be unauthenticated \u2014 backend/apps/products/views.py:114"}, "properties": {"repobilityId": "6ea4fe8a9b096df8", "scanner": "scanner-primary", "fingerprint": "af88a1217c5e1724", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/views.py"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-feb9199877759093", "level": "warning", "message": {"text": "Django view `product_stock_history` may be unauthenticated \u2014 backend/apps/products/views.py:137"}, "properties": {"repobilityId": "8aa9395dacd0fab2", "scanner": "scanner-primary", "fingerprint": "feb9199877759093", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/views.py"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-628d7cb21c50ef8e", "level": "warning", "message": {"text": "Django view `product_barcode_image` may be unauthenticated \u2014 backend/apps/products/views.py:163"}, "properties": {"repobilityId": "0032d86ceeb763f8", "scanner": "scanner-primary", "fingerprint": "628d7cb21c50ef8e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/views.py"}, "region": {"startLine": 163}}}]}, {"ruleId": "scanner-24472a80ec6f3a55", "level": "warning", "message": {"text": "Django view `upload_product_image` may be unauthenticated \u2014 backend/apps/products/views.py:183"}, "properties": {"repobilityId": "21eee1518f7dd671", "scanner": "scanner-primary", "fingerprint": "24472a80ec6f3a55", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/views.py"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-a494a965f186d8c7", "level": "warning", "message": {"text": "Django view `delete_product_image` may be unauthenticated \u2014 backend/apps/products/views.py:231"}, "properties": {"repobilityId": "5148a3f1f117630a", "scanner": "scanner-primary", "fingerprint": "a494a965f186d8c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/views.py"}, "region": {"startLine": 231}}}]}, {"ruleId": "scanner-e9368ce16452f911", "level": "warning", "message": {"text": "Django view `generate_barcode_for_product` may be unauthenticated \u2014 backend/apps/products/views.py:247"}, "properties": {"repobilityId": "84f2ba6181d3f693", "scanner": "scanner-primary", "fingerprint": "e9368ce16452f911", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/views.py"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-73ed8d822e84227e", "level": "warning", "message": {"text": "Django view `print_labels_pdf` may be unauthenticated \u2014 backend/apps/products/views.py:290"}, "properties": {"repobilityId": "7a56f5876db874ab", "scanner": "scanner-primary", "fingerprint": "73ed8d822e84227e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/views.py"}, "region": {"startLine": 290}}}]}, {"ruleId": "scanner-68baa42593ca581f", "level": "warning", "message": {"text": "Django view `inventory_count_items` may be unauthenticated \u2014 backend/apps/products/count_views.py:69"}, "properties": {"repobilityId": "b124b7773f0b7378", "scanner": "scanner-primary", "fingerprint": "68baa42593ca581f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/count_views.py"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-bc60752d10936234", "level": "warning", "message": {"text": "Django view `inventory_count_finalize` may be unauthenticated \u2014 backend/apps/products/count_views.py:108"}, "properties": {"repobilityId": "5771563adf2f56c0", "scanner": "scanner-primary", "fingerprint": "bc60752d10936234", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/products/count_views.py"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-b345941ea248e376", "level": "warning", "message": {"text": "Django view `client_profile` may be unauthenticated \u2014 backend/apps/debts/views.py:55"}, "properties": {"repobilityId": "9f5c69e5947784d0", "scanner": "scanner-primary", "fingerprint": "b345941ea248e376", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/debts/views.py"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-086ea9c832fa3497", "level": "warning", "message": {"text": "Django view `record_payment` may be unauthenticated \u2014 backend/apps/debts/views.py:121"}, "properties": {"repobilityId": "40179910d5164d53", "scanner": "scanner-primary", "fingerprint": "086ea9c832fa3497", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/debts/views.py"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-e07eeb6206ad3601", "level": "warning", "message": {"text": "Django view `get_settings` may be unauthenticated \u2014 backend/apps/system_settings/views.py:15"}, "properties": {"repobilityId": "54a1b555a6081c2c", "scanner": "scanner-primary", "fingerprint": "e07eeb6206ad3601", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/system_settings/views.py"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-6f43ae920b1bcc14", "level": "warning", "message": {"text": "Django view `update_settings` may be unauthenticated \u2014 backend/apps/system_settings/views.py:22"}, "properties": {"repobilityId": "be96d85fdb7f6190", "scanner": "scanner-primary", "fingerprint": "6f43ae920b1bcc14", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/system_settings/views.py"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-3e953eb00e2e5213", "level": "warning", "message": {"text": "Django view `sync_ntp` may be unauthenticated \u2014 backend/apps/system_settings/views.py:33"}, "properties": {"repobilityId": "aacec421deec537e", "scanner": "scanner-primary", "fingerprint": "3e953eb00e2e5213", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/system_settings/views.py"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-53c06122b49633dc", "level": "warning", "message": {"text": "Django view `current_time` may be unauthenticated \u2014 backend/apps/system_settings/views.py:47"}, "properties": {"repobilityId": "17c102623e4de780", "scanner": "scanner-primary", "fingerprint": "53c06122b49633dc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/system_settings/views.py"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-7309bf2446873ccc", "level": "note", "message": {"text": "Unused endpoint: ANY /admin/"}, "properties": {"repobilityId": "1d47feb43791c5ac", "scanner": "scanner-primary", "fingerprint": "7309bf2446873ccc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b861eb8177416b36", "level": "note", "message": {"text": "Unused endpoint: ANY /api/auth/"}, "properties": {"repobilityId": "5c3be0fe7a3f34c7", "scanner": "scanner-primary", "fingerprint": "b861eb8177416b36", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef3b4cedc1e9850a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/products/"}, "properties": {"repobilityId": "658b19299ced7862", "scanner": "scanner-primary", "fingerprint": "ef3b4cedc1e9850a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb8ab9a512ddc831", "level": "note", "message": {"text": "Unused endpoint: ANY /api/sales/"}, "properties": {"repobilityId": "cae4d1c3d16506ce", "scanner": "scanner-primary", "fingerprint": "cb8ab9a512ddc831", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-911491250405cad3", "level": "note", "message": {"text": "Unused endpoint: ANY /api/shifts/"}, "properties": {"repobilityId": "9c70bea2b5bf7398", "scanner": "scanner-primary", "fingerprint": "911491250405cad3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2446b81993dd351f", "level": "note", "message": {"text": "Unused endpoint: ANY /api/debts/"}, "properties": {"repobilityId": "18654c862d02f724", "scanner": "scanner-primary", "fingerprint": "2446b81993dd351f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a021123808ecb295", "level": "note", "message": {"text": "Unused endpoint: ANY /api/loyalty/"}, "properties": {"repobilityId": "2381291ba600c823", "scanner": "scanner-primary", "fingerprint": "a021123808ecb295", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4df1fcdcfb2e05a4", "level": "note", "message": {"text": "Unused endpoint: ANY /api/reports/"}, "properties": {"repobilityId": "6600b1c284699316", "scanner": "scanner-primary", "fingerprint": "4df1fcdcfb2e05a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72535bab05a50bba", "level": "note", "message": {"text": "Unused endpoint: ANY /api/services/"}, "properties": {"repobilityId": "9c992cf1450f3031", "scanner": "scanner-primary", "fingerprint": "72535bab05a50bba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11fb3ddb5793f8f6", "level": "note", "message": {"text": "Unused endpoint: ANY /api/expenses/"}, "properties": {"repobilityId": "c8eb18ebe5d03706", "scanner": "scanner-primary", "fingerprint": "11fb3ddb5793f8f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fab911668069a797", "level": "note", "message": {"text": "Unused endpoint: ANY /api/telegram/"}, "properties": {"repobilityId": "bc7620f5cc486a6d", "scanner": "scanner-primary", "fingerprint": "fab911668069a797", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad55299d74129fef", "level": "note", "message": {"text": "Unused endpoint: ANY /api/backup/"}, "properties": {"repobilityId": "02a1d0800e546775", "scanner": "scanner-primary", "fingerprint": "ad55299d74129fef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2297d4ea9a09794c", "level": "note", "message": {"text": "Unused endpoint: ANY /api/branches/"}, "properties": {"repobilityId": "164ddce8fa0e2404", "scanner": "scanner-primary", "fingerprint": "2297d4ea9a09794c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-941087d3b994e2f8", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hr/"}, "properties": {"repobilityId": "701202eb6a8df651", "scanner": "scanner-primary", "fingerprint": "941087d3b994e2f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c164b14c143274d8", "level": "note", "message": {"text": "Unused endpoint: ANY /api/printer/"}, "properties": {"repobilityId": "24481ec2839bac3d", "scanner": "scanner-primary", "fingerprint": "c164b14c143274d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff8cc410fbe30ac2", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/"}, "properties": {"repobilityId": "8fe85a514742339a", "scanner": "scanner-primary", "fingerprint": "ff8cc410fbe30ac2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c937ee2de46460b", "level": "note", "message": {"text": "Unused endpoint: ANY /api/currency/"}, "properties": {"repobilityId": "b701a718b8b629e9", "scanner": "scanner-primary", "fingerprint": "4c937ee2de46460b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f332ee96b2ae358", "level": "note", "message": {"text": "Unused endpoint: ANY /api/purchases/"}, "properties": {"repobilityId": "2f02a327fce9b038", "scanner": "scanner-primary", "fingerprint": "3f332ee96b2ae358", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e9a17834978cef33", "level": "note", "message": {"text": "Unused endpoint: ANY /api/notifications/"}, "properties": {"repobilityId": "3bffea221d6fa2cd", "scanner": "scanner-primary", "fingerprint": "e9a17834978cef33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-abe49b67d83a0776", "level": "note", "message": {"text": "Unused endpoint: ANY /api/system-settings/"}, "properties": {"repobilityId": "c113af173b30a288", "scanner": "scanner-primary", "fingerprint": "abe49b67d83a0776", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9afea21d9774a77e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/tasks/"}, "properties": {"repobilityId": "a43121372ca774d8", "scanner": "scanner-primary", "fingerprint": "9afea21d9774a77e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7ab6f136f143890", "level": "note", "message": {"text": "Unused endpoint: ANY /^media/(?P<path>.*)$"}, "properties": {"repobilityId": "2dfdb7523d12b90d", "scanner": "scanner-primary", "fingerprint": "a7ab6f136f143890", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36cdb7f9351bcef6", "level": "note", "message": {"text": "Unused endpoint: ANY /api/auth/login/"}, "properties": {"repobilityId": "7bf1b39c822bf2a7", "scanner": "scanner-primary", "fingerprint": "36cdb7f9351bcef6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0f4083d667c135a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/auth/logout/"}, "properties": {"repobilityId": "c55bac41b3ad60a2", "scanner": "scanner-primary", "fingerprint": "e0f4083d667c135a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-69f11e4f376a4fc2", "level": "note", "message": {"text": "Unused endpoint: ANY /api/auth/me/"}, "properties": {"repobilityId": "f8f58836b6ffab4e", "scanner": "scanner-primary", "fingerprint": "69f11e4f376a4fc2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-02666adc63961ac7", "level": "note", "message": {"text": "Unused endpoint: ANY /api/auth/users/"}, "properties": {"repobilityId": "53cb912e9210c550", "scanner": "scanner-primary", "fingerprint": "02666adc63961ac7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc564405ba607d65", "level": "note", "message": {"text": "Unused endpoint: ANY /api/auth/users/<int:pk>/"}, "properties": {"repobilityId": "cb24aee4e05896f3", "scanner": "scanner-primary", "fingerprint": "fc564405ba607d65", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37127456d33e48fe", "level": "note", "message": {"text": "Unused endpoint: ANY /api/telegram/<str:bot_type>/"}, "properties": {"repobilityId": "205148c116327242", "scanner": "scanner-primary", "fingerprint": "37127456d33e48fe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9e201abe068a2977", "level": "note", "message": {"text": "Unused endpoint: ANY /api/telegram/<str:bot_type>/save/"}, "properties": {"repobilityId": "e99fa7a2aadd4716", "scanner": "scanner-primary", "fingerprint": "9e201abe068a2977", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b64bba8ca15762be", "level": "note", "message": {"text": "Unused endpoint: ANY /api/telegram/<str:bot_type>/test/"}, "properties": {"repobilityId": "3cb94e429762f3bd", "scanner": "scanner-primary", "fingerprint": "b64bba8ca15762be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-61985819285c8624", "level": "note", "message": {"text": "Unused endpoint: ANY /api/telegram/<str:bot_type>/toggle/"}, "properties": {"repobilityId": "f5000fd403069e1e", "scanner": "scanner-primary", "fingerprint": "61985819285c8624", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b65d13248cc90edd", "level": "note", "message": {"text": "Unused endpoint: ANY /api/backup/create/"}, "properties": {"repobilityId": "d79f511a8059e3f7", "scanner": "scanner-primary", "fingerprint": "b65d13248cc90edd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-173af64c42d7eb85", "level": "note", "message": {"text": "Unused endpoint: ANY /api/backup/<int:pk>/download/"}, "properties": {"repobilityId": "2f9878deb6b04778", "scanner": "scanner-primary", "fingerprint": "173af64c42d7eb85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-da08eb9395964e7e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/backup/<int:pk>/delete/"}, "properties": {"repobilityId": "1015b47c619b5328", "scanner": "scanner-primary", "fingerprint": "da08eb9395964e7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a00df4abd5b566cd", "level": "note", "message": {"text": "Unused endpoint: ANY /api/backup/preview-import/"}, "properties": {"repobilityId": "d02d675207998a26", "scanner": "scanner-primary", "fingerprint": "a00df4abd5b566cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a1b1c58f66c62a62", "level": "note", "message": {"text": "Unused endpoint: ANY /api/backup/import/"}, "properties": {"repobilityId": "243db867cee91784", "scanner": "scanner-primary", "fingerprint": "a1b1c58f66c62a62", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdafe33e18cf1b74", "level": "note", "message": {"text": "Unused endpoint: ANY /api/backup/available-models/"}, "properties": {"repobilityId": "89a0842b3d6605c5", "scanner": "scanner-primary", "fingerprint": "cdafe33e18cf1b74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d400fef6e9047871", "level": "note", "message": {"text": "Unused endpoint: ANY /api/loyalty/<int:pk>/"}, "properties": {"repobilityId": "237e9f65aa02c99a", "scanner": "scanner-primary", "fingerprint": "d400fef6e9047871", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-024e49b139d1d865", "level": "note", "message": {"text": "Unused endpoint: ANY /api/loyalty/search/<str:card_number>/"}, "properties": {"repobilityId": "ec46956d59f3c3f9", "scanner": "scanner-primary", "fingerprint": "024e49b139d1d865", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08de2a8766f3f561", "level": "note", "message": {"text": "Unused endpoint: ANY /api/loyalty/<int:pk>/adjust-bonus/"}, "properties": {"repobilityId": "b1bc972b27f8f1ea", "scanner": "scanner-primary", "fingerprint": "08de2a8766f3f561", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed122d0a205358b4", "level": "note", "message": {"text": "Unused endpoint: ANY /api/loyalty/transactions/"}, "properties": {"repobilityId": "61600a007db51843", "scanner": "scanner-primary", "fingerprint": "ed122d0a205358b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17d9cd45cf718f7a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/templates/"}, "properties": {"repobilityId": "30b989150716f44f", "scanner": "scanner-primary", "fingerprint": "17d9cd45cf718f7a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dcb3774eae197566", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/templates/<int:pk>/"}, "properties": {"repobilityId": "fdba6cf2b38f180d", "scanner": "scanner-primary", "fingerprint": "dcb3774eae197566", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3d79fb98dbdf146", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/<int:pk>/"}, "properties": {"repobilityId": "7a944c813b6874c2", "scanner": "scanner-primary", "fingerprint": "f3d79fb98dbdf146", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c77f31b0d0378add", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/<int:pk>/recipients/"}, "properties": {"repobilityId": "44e5b7055bf41ab2", "scanner": "scanner-primary", "fingerprint": "c77f31b0d0378add", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f555e6dd4db65b7", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/<int:pk>/cancel/"}, "properties": {"repobilityId": "214097fcbc0952ee", "scanner": "scanner-primary", "fingerprint": "2f555e6dd4db65b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2e29b685221e498", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/<int:pk>/resend/"}, "properties": {"repobilityId": "0f368e7a37c0c59a", "scanner": "scanner-primary", "fingerprint": "e2e29b685221e498", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3bfee6335f106698", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/send/"}, "properties": {"repobilityId": "2f3c6f264bd24124", "scanner": "scanner-primary", "fingerprint": "3bfee6335f106698", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4af8945b7e87e7e6", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/individual/"}, "properties": {"repobilityId": "10c403a65bb02cc6", "scanner": "scanner-primary", "fingerprint": "4af8945b7e87e7e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44a4944110913b6c", "level": "note", "message": {"text": "Unused endpoint: ANY /api/broadcast/schedule/"}, "properties": {"repobilityId": "d1d26ec4460ece25", "scanner": "scanner-primary", "fingerprint": "44a4944110913b6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}