{"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-15c87d897b36765e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CommandPalette.tsx:223", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CommandPalette.tsx:223"}, "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-73fee242652f92c4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Layout.tsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Layout.tsx:279"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-714ac9d3a0a32be2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/KpiCard.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/KpiCard.tsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1bbce5800e164814", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/MasterPage.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/MasterPage.tsx:36"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d1bf46d10e0285f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/JournalsPage.tsx:228", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/JournalsPage.tsx:228"}, "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-9a9926ee16481ab9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SettingsPage.tsx:420", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SettingsPage.tsx:420"}, "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-7ca1888b0f6f1811", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/GatewayPage.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/GatewayPage.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42f2a7886e8d50c2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/journals/AccountPicker.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/journals/AccountPicker.tsx:206"}, "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-dc3aea44da83e2ea", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/bills/BillDetailPage.tsx:602", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/bills/BillDetailPage.tsx:602"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4e06bc070d8aa91", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/vouchers/PaymentRowEditor.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/vouchers/PaymentRowEditor.tsx:84"}, "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-2c8309e726f5a870", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/vouchers/InvoiceAllocationGrid.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/vouchers/InvoiceAllocationGrid.tsx:146"}, "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-47f85cc72ca2b1fc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/vouchers/SimplePaymentVoucher.tsx:721", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/vouchers/SimplePaymentVoucher.tsx:721"}, "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-af8ddf53840b452c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/banking/BankingPage.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/banking/BankingPage.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-66c26c38b7bf4913", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/banking/BankAccountPage.tsx:235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/banking/BankAccountPage.tsx:235"}, "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-40ae2ffc8212764d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/expenses/ExpenseDetailPage.tsx:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/expenses/ExpenseDetailPage.tsx:317"}, "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-cbd8ce149f918aca", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/parties/PartySearchPicker.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/parties/PartySearchPicker.tsx:171"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19d46b2c1f3fd18b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/parties/PartyDetailPage.tsx:453", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/parties/PartyDetailPage.tsx:453"}, "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-d1edafb0965ea92e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/LedgerPage.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/LedgerPage.tsx:195"}, "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-cf58c99441279421", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/DaybookPage.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/DaybookPage.tsx:56"}, "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-d6ea2a0297a4f859", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/BankBookPage.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/BankBookPage.tsx:113"}, "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-9dbae616ae136ee8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/CashBookPage.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/CashBookPage.tsx:113"}, "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-b2a5d995e298960c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/HSNSummaryPage.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/HSNSummaryPage.tsx: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-60427b03771411b6", "name": "Dockerfile runs as root: frontend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: frontend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-faa134129e5545ff", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b048d166901fd868", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-714c31ca9f474ae6", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9bbbfd90508d46c1", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/pages/LoginPage.tsx:31", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/pages/LoginPage.tsx:31"}, "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-ca9c9ae125359f8f", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ea85dd12d07c78a", "name": "Very large file: frontend/src/lib/api.ts (2624 lines)", "shortDescription": {"text": "Very large file: frontend/src/lib/api.ts (2624 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-44b06caf27c537c4", "name": "Very large file: backend/journals/services.py (1764 lines)", "shortDescription": {"text": "Very large file: backend/journals/services.py (1764 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-3cbeee26d0cf4e53", "name": "Very large file: backend/reports/views.py (2522 lines)", "shortDescription": {"text": "Very large file: backend/reports/views.py (2522 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "97 tests / 390 src (ratio 0.25)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 137 placeholder/mock markers across 40 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, operator-readme. 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, operator-readme. 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-f29253e4bd148aa5", "name": "Commented-code block (5 lines) in frontend/vite.config.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/vite.config.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d925869d6f021611", "name": "Commented-code block (5 lines) in frontend/src/components/Layout.tsx:50", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/Layout.tsx:50"}, "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-bdd925cd49429dd3", "name": "Commented-code block (6 lines) in frontend/src/pages/SettingsPage.tsx:232", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/SettingsPage.tsx:232"}, "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-3175d54793c9733b", "name": "Commented-code block (5 lines) in frontend/src/pages/vouchers/VoucherEditor.tsx:207", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/vouchers/VoucherEditor.tsx:207"}, "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-8a91a31baa475df9", "name": "Commented-code block (5 lines) in frontend/src/pages/vouchers/SimplePaymentVoucher.tsx:260", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/vouchers/SimplePaymentVoucher.tsx:260"}, "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-39682b8e932fa9ad", "name": "Legacy-named symbol `days_old` in backend/notifications/services.py:150", "shortDescription": {"text": "Legacy-named symbol `days_old` in backend/notifications/services.py:150"}, "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-b684531f22035740", "name": "Likely N+1 query: `for emi in \u2026` triggers a query per row \u2014 backend/notifications/services.py:98", "shortDescription": {"text": "Likely N+1 query: `for emi in \u2026` triggers a query per row \u2014 backend/notifications/services.py:98"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `emi.loan.loan_no` 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-39fbe36fd47e11f0", "name": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/notifications/services.py:150", "shortDescription": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/notifications/services.py:150"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `line.entry.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-472c608a42f97240", "name": "Likely N+1 query: `for cheque in \u2026` triggers a query per row \u2014 backend/notifications/services.py:183", "shortDescription": {"text": "Likely N+1 query: `for cheque in \u2026` triggers a query per row \u2014 backend/notifications/services.py:183"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `cheque.kind.title` 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-99b01a5b75a84612", "name": "Likely N+1 query: `for lock in \u2026` triggers a query per row \u2014 backend/notifications/services.py:226", "shortDescription": {"text": "Likely N+1 query: `for lock in \u2026` triggers a query per row \u2014 backend/notifications/services.py:226"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `lock.locked_by.username` 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-ddfb423abadf94f9", "name": "Commented-code block (6 lines) in backend/sync/services.py:18", "shortDescription": {"text": "Commented-code block (6 lines) in backend/sync/services.py:18"}, "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-dfc8aff15e0fc7cd", "name": "Likely N+1 query: `for e in \u2026` triggers a query per row \u2014 backend/gst_returns/views.py:209", "shortDescription": {"text": "Likely N+1 query: `for e in \u2026` triggers a query per row \u2014 backend/gst_returns/views.py:209"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `e.invoice_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-c710c35b15f280a0", "name": "Commented-code block (5 lines) in backend/gst_returns/services.py:131", "shortDescription": {"text": "Commented-code block (5 lines) in backend/gst_returns/services.py:131"}, "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-c08ea57b723a11d0", "name": "Likely N+1 query: `for pos in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:139", "shortDescription": {"text": "Likely N+1 query: `for pos in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:139"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `pos.lines.all` 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-141d4edb2f5ca6f9", "name": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:199", "shortDescription": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:199"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `line.product.pharma_hsn_code` 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-48c5d0b8c3e03377", "name": "Likely N+1 query: `for order in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:225", "shortDescription": {"text": "Likely N+1 query: `for order in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:225"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `order.customer.gst_no` 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-f33f5398b35be236", "name": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:285", "shortDescription": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:285"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `line.product.pharma_hsn_code` 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-a2cd15c46d782d55", "name": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:410", "shortDescription": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:410"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `line.product.pharma_hsn_code` 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-29dfbfb760ad77bb", "name": "Likely N+1 query: `for po in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:598", "shortDescription": {"text": "Likely N+1 query: `for po in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:598"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `po.supplier.gst_no` 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-57678ca841821caf", "name": "Likely N+1 query: `for je in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:869", "shortDescription": {"text": "Likely N+1 query: `for je in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:869"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `je.lines.all` 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-b5dd149f70ecf5a0", "name": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:882", "shortDescription": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:882"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `line.account.account_code` 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-b875d65cc6e715fc", "name": "Commented-code block (6 lines) in backend/gst_returns/annual_return.py:72", "shortDescription": {"text": "Commented-code block (6 lines) in backend/gst_returns/annual_return.py:72"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9363221c7bf37371", "name": "Commented-code block (6 lines) in backend/journals/serializers.py:288", "shortDescription": {"text": "Commented-code block (6 lines) in backend/journals/serializers.py:288"}, "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-b622a5dff3a32777", "name": "Commented-code block (5 lines) in backend/journals/views.py:245", "shortDescription": {"text": "Commented-code block (5 lines) in backend/journals/views.py:245"}, "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-747bf150a535fdd2", "name": "Commented-code block (5 lines) in backend/journals/services.py:45", "shortDescription": {"text": "Commented-code block (5 lines) in backend/journals/services.py:45"}, "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-345fdabeb3f348cb", "name": "Commented-code block (6 lines) in backend/journals/models.py:282", "shortDescription": {"text": "Commented-code block (6 lines) in backend/journals/models.py:282"}, "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-67fba3416876a600", "name": "Likely N+1 query: `for row in \u2026` triggers a query per row \u2014 backend/audit/views.py:74", "shortDescription": {"text": "Likely N+1 query: `for row in \u2026` triggers a query per row \u2014 backend/audit/views.py:74"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `row.timestamp.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-2070b06af6f6635a", "name": "Commented-code block (6 lines) in backend/bills/services.py:338", "shortDescription": {"text": "Commented-code block (6 lines) in backend/bills/services.py:338"}, "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-8a23096c6d87f55e", "name": "Commented-code block (6 lines) in backend/expenses/serializers.py:22", "shortDescription": {"text": "Commented-code block (6 lines) in backend/expenses/serializers.py:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e88a245922504bce", "name": "Commented-code block (5 lines) in backend/parties/views.py:293", "shortDescription": {"text": "Commented-code block (5 lines) in backend/parties/views.py:293"}, "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-910126db3d4da4e1", "name": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/parties/services.py:225", "shortDescription": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/parties/services.py:225"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `line.entry.voucher_type` 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-d91d22f87342860e", "name": "Commented-code block (6 lines) in backend/parties/models.py:81", "shortDescription": {"text": "Commented-code block (6 lines) in backend/parties/models.py:81"}, "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-261cb01e5f516f4a", "name": "Commented-code block (5 lines) in backend/core/serializers.py:84", "shortDescription": {"text": "Commented-code block (5 lines) in backend/core/serializers.py:84"}, "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-33484d9ca62e6e24", "name": "Commented-code block (5 lines) in backend/core/year_end.py:185", "shortDescription": {"text": "Commented-code block (5 lines) in backend/core/year_end.py:185"}, "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-3f6e9b1f85119c06", "name": "Commented-code block (5 lines) in backend/core/period_lock.py:84", "shortDescription": {"text": "Commented-code block (5 lines) in backend/core/period_lock.py:84"}, "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-2028e4b6b859c224", "name": "Commented-code block (6 lines) in backend/core/models.py:88", "shortDescription": {"text": "Commented-code block (6 lines) in backend/core/models.py:88"}, "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-046c7cb81a10eaa8", "name": "Likely N+1 query: `for rel in \u2026` triggers a query per row \u2014 backend/core/management/commands/prune_unused_accounts.py:37", "shortDescription": {"text": "Likely N+1 query: `for rel in \u2026` triggers a query per row \u2014 backend/core/management/commands/prune_unused_accounts.py:37"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `rel.field.attname` 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-bc24f3d4450cb8cc", "name": "Network/subprocess call without timeout or try/except \u2014 backend/core/management/commands/backup_db.py:60", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 backend/core/management/commands/backup_db.py:60"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e50bf704824e200c", "name": "Likely N+1 query: `for bill in \u2026` triggers a query per row \u2014 backend/core/management/commands/cleanup_untagged_manual_jv", "shortDescription": {"text": "Likely N+1 query: `for bill in \u2026` triggers a query per row \u2014 backend/core/management/commands/cleanup_untagged_manual_jvs.py:240"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `bill.bill_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-3c57936568bb6fe0", "name": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/core/migrations/0025_sales_income_mappings.py:65", "shortDescription": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/core/migrations/0025_sales_income_mappings.py:65"}, "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-40f4dab8a27ecffe", "name": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/core/migrations/0021_losses_to_indirect_expenses.p", "shortDescription": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/core/migrations/0021_losses_to_indirect_expenses.py:43"}, "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-1bd1608d41726af3", "name": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/core/migrations/0022_petty_cash_expense_account.py", "shortDescription": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/core/migrations/0022_petty_cash_expense_account.py:42"}, "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-4054a2b4186b0061", "name": "Commented-code block (6 lines) in backend/reports/views.py:248", "shortDescription": {"text": "Commented-code block (6 lines) in backend/reports/views.py:248"}, "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-e50373f44232133a", "name": "Likely N+1 query: `for entry in \u2026` triggers a query per row \u2014 backend/reports/views.py:1009", "shortDescription": {"text": "Likely N+1 query: `for entry in \u2026` triggers a query per row \u2014 backend/reports/views.py:1009"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `entry.lines.all` 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-934a5bc48d973229", "name": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/reports/views.py:1011", "shortDescription": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/reports/views.py:1011"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `line.account.account_code` 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-5f8998c618b96391", "name": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/reports/views.py:1561", "shortDescription": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/reports/views.py:1561"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `line.entry.entry_no` 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-3152962c110681dc", "name": "Commented-code block (5 lines) in backend/accounting_project/settings/base.py:286", "shortDescription": {"text": "Commented-code block (5 lines) in backend/accounting_project/settings/base.py:286"}, "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-23699df8ae345d3d", "name": "Commented-code block (5 lines) in backend/loans/views.py:31", "shortDescription": {"text": "Commented-code block (5 lines) in backend/loans/views.py:31"}, "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-b12f5ef8b70e9a95", "name": "Likely N+1 query: `for row in \u2026` triggers a query per row \u2014 backend/tds/views.py:340", "shortDescription": {"text": "Likely N+1 query: `for row in \u2026` triggers a query per row \u2014 backend/tds/views.py:340"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `row.transaction_date.year` 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-2132f0de460c117f", "name": "Commented-code block (7 lines) in backend/tds/services.py:457", "shortDescription": {"text": "Commented-code block (7 lines) in backend/tds/services.py:457"}, "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-472a629f408061b2", "name": "Commented-code block (6 lines) in backend/tds/tests/test_tcs.py:43", "shortDescription": {"text": "Commented-code block (6 lines) in backend/tds/tests/test_tcs.py:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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/notifications/views.py:get_queryset, backend/notifications/views.py:get_queryset\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/sync/views.py:post, backend/sync/views.py:post, backend/sync/views.py:post, backend/sync/views.py:post\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/sync/views.py:get, backend/sync/views.py:get, backend/sync/views.py:get\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-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/journals/serializers.py:validate, backend/journals/serializers.py:validate, backend/journals/serializers.py:validate, backend/journals/serializers.py:validate\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-8e11138a9f634ca9", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-06fd8c2abcd9399b", "name": "Frontend route `accounts` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `accounts` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-55df395c2c021ea7", "name": "Frontend route `journals` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `journals` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9305104432b6a6d2", "name": "Frontend route `journals/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `journals/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-16f4a3e751f52195", "name": "Frontend route `vouchers/payment` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/payment` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6089614e18b4db7f", "name": "Frontend route `vouchers/payment/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/payment/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d8c3d3358abb78c", "name": "Frontend route `vouchers/receipt` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/receipt` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-83fab924fc8b739d", "name": "Frontend route `vouchers/receipt/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/receipt/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-461b429bd694074f", "name": "Frontend route `vouchers/contra` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/contra` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27ba12d264966c92", "name": "Frontend route `vouchers/contra/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/contra/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63b031fc8d8ed12a", "name": "Frontend route `vouchers/journal` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/journal` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e93b356dbb33a139", "name": "Frontend route `vouchers/journal/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/journal/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5821f31d9d2b9fe", "name": "Frontend route `vouchers/sales` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/sales` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c1113acfeaaa6fb8", "name": "Frontend route `vouchers/sales/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/sales/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb3638c0706a75c0", "name": "Frontend route `vouchers/purchase` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/purchase` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0d0be8e8a18951a5", "name": "Frontend route `vouchers/purchase/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/purchase/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5804e65947dfc8ba", "name": "Frontend route `vouchers/credit-note` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/credit-note` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3fc3e15f6ddaf0e", "name": "Frontend route `vouchers/credit-note/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/credit-note/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b4b2a583f10ac8f", "name": "Frontend route `vouchers/debit-note` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/debit-note` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f4615badd5bdca8f", "name": "Frontend route `vouchers/debit-note/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `vouchers/debit-note/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-833db13a05ffd56e", "name": "Frontend route `journals/recurring` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `journals/recurring` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4631f4e89ea8a3d6", "name": "Frontend route `journals/recurring/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `journals/recurring/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-14abf36fe722fd74", "name": "Frontend route `journals/recurring/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `journals/recurring/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-509cd8534e66a2c8", "name": "Frontend route `journals/recurring/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `journals/recurring/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9ff4fabb06a21437", "name": "Frontend route `journals/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `journals/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d7f6833e3a8b7f85", "name": "Frontend route `journals/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `journals/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-601bb0d53928e165", "name": "Frontend route `bills` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `bills` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-578c1c716722784e", "name": "Frontend route `bills/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `bills/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51b945fd21f115ed", "name": "Frontend route `bills/recurring` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `bills/recurring` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d2a99b27df887fd", "name": "Frontend route `bills/recurring/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `bills/recurring/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8483ec9320433625", "name": "Frontend route `bills/recurring/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `bills/recurring/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6957ecb6f8648ab5", "name": "Frontend route `bills/recurring/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `bills/recurring/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8382b475520c7dac", "name": "Frontend route `bills/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `bills/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17b5a972343176cd", "name": "Frontend route `bills/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `bills/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ca536fcbfae4e8b6", "name": "Frontend route `banking` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `banking` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71ddb6066a1a5064", "name": "Frontend route `banking/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `banking/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd8290e1122ff48d", "name": "Frontend route `expenses` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `expenses` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-375a77579ba89fed", "name": "Frontend route `expenses/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `expenses/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c36355e6de94f676", "name": "Frontend route `expenses/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `expenses/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e5e554f11033cd4b", "name": "Frontend route `expenses/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `expenses/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-185cb336e2b20968", "name": "Frontend route `receivables` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `receivables` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b88136de427b382b", "name": "Frontend route `payables` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `payables` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-62e4ef1bcc09eb36", "name": "Frontend route `parties/suppliers` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `parties/suppliers` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-605b86a0ea639470", "name": "Frontend route `parties/suppliers/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `parties/suppliers/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9406b81a50a382fb", "name": "Frontend route `parties/customers` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `parties/customers` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-155e5034e49d880c", "name": "Frontend route `parties/customers/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `parties/customers/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f955cc50def54754", "name": "Frontend route `gst/gstr1` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `gst/gstr1` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f006b4b4bd972e75", "name": "Frontend route `gst/gstr2b` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `gst/gstr2b` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-109707a0fc218b2b", "name": "Frontend route `gst/gstr3b` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `gst/gstr3b` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-245ba3f753cd64a0", "name": "Frontend route `gst/grand-summary` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `gst/grand-summary` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5b35a33e5b62bd96", "name": "Frontend route `gst/itc-reconciliation` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `gst/itc-reconciliation` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9c80f57ff8770027", "name": "Frontend route `gst/filing-health` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `gst/filing-health` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-af8818a2236a2a00", "name": "Frontend route `tds` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `tds` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aca500c66abb564a", "name": "Frontend route `reports/trial-balance` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/trial-balance` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9a324ba475f92d1f", "name": "Frontend route `reports/profit-loss` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/profit-loss` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae0a2908aab05241", "name": "Frontend route `reports/balance-sheet` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/balance-sheet` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ef6dc82628675a5", "name": "Frontend route `reports/gst-computation` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/gst-computation` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b70dd7a4efc25d61", "name": "Frontend route `reports/hsn-summary` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/hsn-summary` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bbdbedaa2566c1d2", "name": "Frontend route `reports/party-outstanding` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/party-outstanding` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f8621091841adead", "name": "Frontend route `reports/bank-book` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/bank-book` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bae1cac698d9c365", "name": "Frontend route `reports/cash-book` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/cash-book` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1113eecc0f0d70d3", "name": "Frontend route `reports/daybook` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/daybook` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f36db98adb5870d1", "name": "Frontend route `payroll` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `payroll` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-36e808141312157f", "name": "Frontend route `reports/stock-summary` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/stock-summary` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5e8d33cf404062a4", "name": "Frontend route `reports/ledger/:code` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `reports/ledger/:code` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-606dd864a7599a94", "name": "Frontend route `sync` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `sync` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed2bc19f149c2b14", "name": "Frontend route `audit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `audit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17bacb17f6efb788", "name": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c9074eb7ac2ac39e", "name": "Frontend route `setup` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `setup` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dcda81bd6e115938", "name": "Frontend route `cost-centres` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `cost-centres` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-66ff2257566de603", "name": "Frontend route `voucher-types` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `voucher-types` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f56abe42663d5af3", "name": "Frontend route `activity-map` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `activity-map` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6931b7d40b0a7bfb", "name": "Frontend route `fixed-assets` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `fixed-assets` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-30be9addd59fe292", "name": "Frontend route `loans` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `loans` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-803e0fb1b3195a8c", "name": "Frontend route `banking/cheques` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `banking/cheques` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cdcdcb913cfd2fb4", "name": "Frontend route `banking/petty-cash` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `banking/petty-cash` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3b57366db47bd395", "name": "Frontend route `notifications` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `notifications` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-380b9072cc787dcd", "name": "Frontend route `journals/closing-entries` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `journals/closing-entries` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e975cfa8e69d2ed", "name": "DRF view `BudgetViewSet` declares no `permission_classes` \u2014 backend/budgets/views.py:13", "shortDescription": {"text": "DRF view `BudgetViewSet` declares no `permission_classes` \u2014 backend/budgets/views.py:13"}, "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-b2ab7855f571d536", "name": "DRF view `BudgetVarianceView` declares no `permission_classes` \u2014 backend/budgets/views.py:41", "shortDescription": {"text": "DRF view `BudgetVarianceView` declares no `permission_classes` \u2014 backend/budgets/views.py:41"}, "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-ef1ee8910ba8c8df", "name": "DRF view `NotificationViewSet` declares no `permission_classes` \u2014 backend/notifications/views.py:11", "shortDescription": {"text": "DRF view `NotificationViewSet` declares no `permission_classes` \u2014 backend/notifications/views.py:11"}, "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-8a3fcf96c6747f56", "name": "DRF view `NotificationPreferenceViewSet` declares no `permission_classes` \u2014 backend/notifications/views.py:86", "shortDescription": {"text": "DRF view `NotificationPreferenceViewSet` declares no `permission_classes` \u2014 backend/notifications/views.py:86"}, "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-c44504a80a2b9d14", "name": "DRF view `SyncRunView` declares no `permission_classes` \u2014 backend/sync/views.py:22", "shortDescription": {"text": "DRF view `SyncRunView` declares no `permission_classes` \u2014 backend/sync/views.py:22"}, "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-7881611fb4ed126e", "name": "DRF view `SyncLogListView` declares no `permission_classes` \u2014 backend/sync/views.py:30", "shortDescription": {"text": "DRF view `SyncLogListView` declares no `permission_classes` \u2014 backend/sync/views.py:30"}, "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-1eb97a49e15d1cca", "name": "DRF view `SyncRetryView` declares no `permission_classes` \u2014 backend/sync/views.py:41", "shortDescription": {"text": "DRF view `SyncRetryView` declares no `permission_classes` \u2014 backend/sync/views.py:41"}, "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-973346c3042be04d", "name": "DRF view `SyncErrorListView` declares no `permission_classes` \u2014 backend/sync/views.py:49", "shortDescription": {"text": "DRF view `SyncErrorListView` declares no `permission_classes` \u2014 backend/sync/views.py:49"}, "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-590992ee32add2bc", "name": "DRF view `GSTGrandSummaryView` declares no `permission_classes` \u2014 backend/gst_returns/grand_summary.py:171", "shortDescription": {"text": "DRF view `GSTGrandSummaryView` declares no `permission_classes` \u2014 backend/gst_returns/grand_summary.py:171"}, "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-21af39a65592169c", "name": "DRF view `GSTR1EntryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:43", "shortDescription": {"text": "DRF view `GSTR1EntryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:43"}, "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-430740e2d371f74a", "name": "DRF view `GSTR1HSNSummaryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:321", "shortDescription": {"text": "DRF view `GSTR1HSNSummaryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:321"}, "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-4b22e3efaa679d78", "name": "DRF view `GSTR3BSummaryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:338", "shortDescription": {"text": "DRF view `GSTR3BSummaryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:338"}, "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-c5e2f5ec9325aed5", "name": "DRF view `GSTR9View` declares no `permission_classes` \u2014 backend/gst_returns/views.py:387", "shortDescription": {"text": "DRF view `GSTR9View` declares no `permission_classes` \u2014 backend/gst_returns/views.py:387"}, "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-981b3f443971ce4c", "name": "DRF view `EWayBillViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:408", "shortDescription": {"text": "DRF view `EWayBillViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:408"}, "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-b3a741519506f642", "name": "DRF view `GSTR9CView` declares no `permission_classes` \u2014 backend/gst_returns/views.py:441", "shortDescription": {"text": "DRF view `GSTR9CView` declares no `permission_classes` \u2014 backend/gst_returns/views.py:441"}, "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-1b2532f0f3821c60", "name": "DRF view `GSTLateFeeView` declares no `permission_classes` \u2014 backend/gst_returns/views.py:474", "shortDescription": {"text": "DRF view `GSTLateFeeView` declares no `permission_classes` \u2014 backend/gst_returns/views.py:474"}, "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-e6d7b21ee0eb046e", "name": "DRF view `GSTSetoffPreviewView` declares no `permission_classes` \u2014 backend/gst_returns/views.py:491", "shortDescription": {"text": "DRF view `GSTSetoffPreviewView` declares no `permission_classes` \u2014 backend/gst_returns/views.py:491"}, "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-be65415cb076e1a9", "name": "DRF view `GSTR2BEntryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:522", "shortDescription": {"text": "DRF view `GSTR2BEntryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:522"}, "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-3b6b9ce93d58c4d6", "name": "DRF view `ITCReconciliationViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:705", "shortDescription": {"text": "DRF view `ITCReconciliationViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:705"}, "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-831f1608d9eb66ef", "name": "DRF view `RCMEntryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:773", "shortDescription": {"text": "DRF view `RCMEntryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:773"}, "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-4e0a94598b03f594", "name": "DRF view `JournalEntryViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:74", "shortDescription": {"text": "DRF view `JournalEntryViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:74"}, "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-ac267d8620994b2e", "name": "DRF view `RecurringJournalViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:445", "shortDescription": {"text": "DRF view `RecurringJournalViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:445"}, "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-21942d2366baa41f", "name": "DRF view `BillReferenceViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:559", "shortDescription": {"text": "DRF view `BillReferenceViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:559"}, "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-b9b541da3f750d71", "name": "DRF view `VoucherTypeProfileViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:623", "shortDescription": {"text": "DRF view `VoucherTypeProfileViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:623"}, "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-900f3391d8b0e3b6", "name": "DRF view `AuditLogListView` declares no `permission_classes` \u2014 backend/audit/views.py:42", "shortDescription": {"text": "DRF view `AuditLogListView` declares no `permission_classes` \u2014 backend/audit/views.py:42"}, "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-784d2e08339bb227", "name": "DRF view `AuditLogCSVExportView` declares no `permission_classes` \u2014 backend/audit/views.py:57", "shortDescription": {"text": "DRF view `AuditLogCSVExportView` declares no `permission_classes` \u2014 backend/audit/views.py:57"}, "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-7f1f6eda74c3eb2a", "name": "DRF view `AuditChainVerifyView` declares no `permission_classes` \u2014 backend/audit/views.py:84", "shortDescription": {"text": "DRF view `AuditChainVerifyView` declares no `permission_classes` \u2014 backend/audit/views.py:84"}, "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-d872cbdc3b790027", "name": "DRF view `BillViewSet` declares no `permission_classes` \u2014 backend/bills/views.py:33", "shortDescription": {"text": "DRF view `BillViewSet` declares no `permission_classes` \u2014 backend/bills/views.py:33"}, "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-c4654db4158e95d3", "name": "DRF view `BillAttachmentDetailViewSet` declares no `permission_classes` \u2014 backend/bills/views.py:341", "shortDescription": {"text": "DRF view `BillAttachmentDetailViewSet` declares no `permission_classes` \u2014 backend/bills/views.py:341"}, "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-cd7535c39afbc71b", "name": "DRF view `RecurringBillViewSet` declares no `permission_classes` \u2014 backend/bills/views.py:358", "shortDescription": {"text": "DRF view `RecurringBillViewSet` declares no `permission_classes` \u2014 backend/bills/views.py:358"}, "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-ac8357a4cc5059df", "name": "DRF view `BillPaymentDetailView` declares no `permission_classes` \u2014 backend/bills/views.py:451", "shortDescription": {"text": "DRF view `BillPaymentDetailView` declares no `permission_classes` \u2014 backend/bills/views.py:451"}, "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-1c940046f99d3982", "name": "DRF view `EmployeeViewSet` declares no `permission_classes` \u2014 backend/payroll/views.py:19", "shortDescription": {"text": "DRF view `EmployeeViewSet` declares no `permission_classes` \u2014 backend/payroll/views.py:19"}, "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-9bcf90710b5b7bc2", "name": "DRF view `SalaryStructureViewSet` declares no `permission_classes` \u2014 backend/payroll/views.py:41", "shortDescription": {"text": "DRF view `SalaryStructureViewSet` declares no `permission_classes` \u2014 backend/payroll/views.py:41"}, "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-726796ee5b5b6375", "name": "DRF view `PayrollRunViewSet` declares no `permission_classes` \u2014 backend/payroll/views.py:64", "shortDescription": {"text": "DRF view `PayrollRunViewSet` declares no `permission_classes` \u2014 backend/payroll/views.py:64"}, "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-a5d760551d7ef851", "name": "DRF view `BankAccountViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:21", "shortDescription": {"text": "DRF view `BankAccountViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:21"}, "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-e4b539f51ce8afb1", "name": "DRF view `BankTransactionViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:89", "shortDescription": {"text": "DRF view `BankTransactionViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:89"}, "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-1fde433eadc8615f", "name": "DRF view `ChequeViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:237", "shortDescription": {"text": "DRF view `ChequeViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:237"}, "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-36546ef58358d654", "name": "DRF view `PettyCashFloatViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:298", "shortDescription": {"text": "DRF view `PettyCashFloatViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:298"}, "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-f50841b02051946b", "name": "DRF view `AssetClassViewSet` declares no `permission_classes` \u2014 backend/fixed_assets/views.py:25", "shortDescription": {"text": "DRF view `AssetClassViewSet` declares no `permission_classes` \u2014 backend/fixed_assets/views.py:25"}, "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-c371242e2d7c55bd", "name": "DRF view `FixedAssetViewSet` declares no `permission_classes` \u2014 backend/fixed_assets/views.py:33", "shortDescription": {"text": "DRF view `FixedAssetViewSet` declares no `permission_classes` \u2014 backend/fixed_assets/views.py:33"}, "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-d04e9570676e1a94", "name": "DRF view `DepreciationRunView` declares no `permission_classes` \u2014 backend/fixed_assets/views.py:97", "shortDescription": {"text": "DRF view `DepreciationRunView` declares no `permission_classes` \u2014 backend/fixed_assets/views.py:97"}, "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-cd3e25299290437b", "name": "DRF view `ExpenseViewSet` declares no `permission_classes` \u2014 backend/expenses/views.py:28", "shortDescription": {"text": "DRF view `ExpenseViewSet` declares no `permission_classes` \u2014 backend/expenses/views.py:28"}, "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-d5b2201d53d6ab79", "name": "DRF view `ExpenseAttachmentViewSet` declares no `permission_classes` \u2014 backend/expenses/views.py:145", "shortDescription": {"text": "DRF view `ExpenseAttachmentViewSet` declares no `permission_classes` \u2014 backend/expenses/views.py:145"}, "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-ef3ed40b4db531e4", "name": "DRF view `SuppliersListView` declares no `permission_classes` \u2014 backend/parties/views.py:71", "shortDescription": {"text": "DRF view `SuppliersListView` declares no `permission_classes` \u2014 backend/parties/views.py:71"}, "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-ea467e85bffb17c7", "name": "DRF view `CustomersListView` declares no `permission_classes` \u2014 backend/parties/views.py:82", "shortDescription": {"text": "DRF view `CustomersListView` declares no `permission_classes` \u2014 backend/parties/views.py:82"}, "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-6065fff7f6025aa8", "name": "DRF view `SupplierDetailView` declares no `permission_classes` \u2014 backend/parties/views.py:95", "shortDescription": {"text": "DRF view `SupplierDetailView` declares no `permission_classes` \u2014 backend/parties/views.py:95"}, "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-adddbce1cf5bdc14", "name": "DRF view `CustomerDetailView` declares no `permission_classes` \u2014 backend/parties/views.py:106", "shortDescription": {"text": "DRF view `CustomerDetailView` declares no `permission_classes` \u2014 backend/parties/views.py:106"}, "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-e71e81a92c4c0cfd", "name": "DRF view `_PartyTransactionsView` declares no `permission_classes` \u2014 backend/parties/views.py:119", "shortDescription": {"text": "DRF view `_PartyTransactionsView` declares no `permission_classes` \u2014 backend/parties/views.py:119"}, "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-03a7df9144b59c3d", "name": "DRF view `_PartyStatementView` declares no `permission_classes` \u2014 backend/parties/views.py:143", "shortDescription": {"text": "DRF view `_PartyStatementView` declares no `permission_classes` \u2014 backend/parties/views.py:143"}, "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-a903ff8274e7a54d", "name": "DRF view `_PartyStatementCSVView` declares no `permission_classes` \u2014 backend/parties/views.py:165", "shortDescription": {"text": "DRF view `_PartyStatementCSVView` declares no `permission_classes` \u2014 backend/parties/views.py:165"}, "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-45329c8984842465", "name": "Django CBV `SupplierStatementCSVView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:203", "shortDescription": {"text": "Django CBV `SupplierStatementCSVView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:203"}, "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-fdd10e7f7f458737", "name": "Django CBV `CustomerStatementCSVView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:208", "shortDescription": {"text": "Django CBV `CustomerStatementCSVView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:208"}, "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-4bef3e8c1ebd0ae7", "name": "DRF view `_PartyCommunicationsView` declares no `permission_classes` \u2014 backend/parties/views.py:215", "shortDescription": {"text": "DRF view `_PartyCommunicationsView` declares no `permission_classes` \u2014 backend/parties/views.py:215"}, "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-379d2b1830b3576f", "name": "Django CBV `SupplierCommunicationsView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:242", "shortDescription": {"text": "Django CBV `SupplierCommunicationsView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:242"}, "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-7235a19758cbc27d", "name": "Django CBV `CustomerCommunicationsView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:247", "shortDescription": {"text": "Django CBV `CustomerCommunicationsView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:247"}, "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-cd660dbad00211de", "name": "DRF view `_PartyOpeningBalanceView` declares no `permission_classes` \u2014 backend/parties/views.py:254", "shortDescription": {"text": "DRF view `_PartyOpeningBalanceView` declares no `permission_classes` \u2014 backend/parties/views.py:254"}, "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-46971745b1ae4e23", "name": "Django CBV `SupplierOpeningBalanceView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:319", "shortDescription": {"text": "Django CBV `SupplierOpeningBalanceView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:319"}, "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-e88dcd7cb967d370", "name": "Django CBV `CustomerOpeningBalanceView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:324", "shortDescription": {"text": "Django CBV `CustomerOpeningBalanceView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:324"}, "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-2d9a024c31cd5a1e", "name": "DRF view `CommunicationDetailView` declares no `permission_classes` \u2014 backend/parties/views.py:329", "shortDescription": {"text": "DRF view `CommunicationDetailView` declares no `permission_classes` \u2014 backend/parties/views.py:329"}, "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-b7ade3b25b7d1b25", "name": "DRF view `ChartOfAccountViewSet` declares no `permission_classes` \u2014 backend/core/views.py:48", "shortDescription": {"text": "DRF view `ChartOfAccountViewSet` declares no `permission_classes` \u2014 backend/core/views.py:48"}, "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-d8190a63ed27fd9c", "name": "DRF view `UserLocationsView` declares no `permission_classes` \u2014 backend/core/views.py:371", "shortDescription": {"text": "DRF view `UserLocationsView` declares no `permission_classes` \u2014 backend/core/views.py:371"}, "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-fa2b454b59002182", "name": "DRF view `SuppliersListView` declares no `permission_classes` \u2014 backend/core/views.py:413", "shortDescription": {"text": "DRF view `SuppliersListView` declares no `permission_classes` \u2014 backend/core/views.py:413"}, "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-d24bca70acbc67f0", "name": "DRF view `CustomersListView` declares no `permission_classes` \u2014 backend/core/views.py:420", "shortDescription": {"text": "DRF view `CustomersListView` declares no `permission_classes` \u2014 backend/core/views.py:420"}, "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-1a9e744b9f424170", "name": "DRF view `DashboardView` declares no `permission_classes` \u2014 backend/core/views.py:427", "shortDescription": {"text": "DRF view `DashboardView` declares no `permission_classes` \u2014 backend/core/views.py:427"}, "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-3afd823aea55d14e", "name": "DRF view `CostCategoryViewSet` declares no `permission_classes` \u2014 backend/core/views.py:648", "shortDescription": {"text": "DRF view `CostCategoryViewSet` declares no `permission_classes` \u2014 backend/core/views.py:648"}, "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-fbda52ccbaf15a43", "name": "DRF view `CostCentreViewSet` declares no `permission_classes` \u2014 backend/core/views.py:672", "shortDescription": {"text": "DRF view `CostCentreViewSet` declares no `permission_classes` \u2014 backend/core/views.py:672"}, "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-59592fc185ae680f", "name": "Django view `resolve_ledger_account` may be unauthenticated \u2014 backend/reports/views.py:15", "shortDescription": {"text": "Django view `resolve_ledger_account` may be unauthenticated \u2014 backend/reports/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-d772d0442c51d167", "name": "DRF view `TrialBalanceView` declares no `permission_classes` \u2014 backend/reports/views.py:44", "shortDescription": {"text": "DRF view `TrialBalanceView` declares no `permission_classes` \u2014 backend/reports/views.py:44"}, "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-e098f0d719f783c4", "name": "DRF view `ProfitLossView` declares no `permission_classes` \u2014 backend/reports/views.py:105", "shortDescription": {"text": "DRF view `ProfitLossView` declares no `permission_classes` \u2014 backend/reports/views.py:105"}, "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-707c57e37dc40e50", "name": "DRF view `BalanceSheetView` declares no `permission_classes` \u2014 backend/reports/views.py:236", "shortDescription": {"text": "DRF view `BalanceSheetView` declares no `permission_classes` \u2014 backend/reports/views.py:236"}, "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-69e7f84931c5b326", "name": "DRF view `LedgerView` declares no `permission_classes` \u2014 backend/reports/views.py:355", "shortDescription": {"text": "DRF view `LedgerView` declares no `permission_classes` \u2014 backend/reports/views.py:355"}, "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-74323571fb235518", "name": "DRF view `LedgerExportView` declares no `permission_classes` \u2014 backend/reports/views.py:447", "shortDescription": {"text": "DRF view `LedgerExportView` declares no `permission_classes` \u2014 backend/reports/views.py:447"}, "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-26176a669d21d808", "name": "DRF view `ReceivablesAgingView` declares no `permission_classes` \u2014 backend/reports/views.py:655", "shortDescription": {"text": "DRF view `ReceivablesAgingView` declares no `permission_classes` \u2014 backend/reports/views.py:655"}, "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-c4c29cbf9f95b830", "name": "DRF view `OpenCustomerInvoicesView` declares no `permission_classes` \u2014 backend/reports/views.py:822", "shortDescription": {"text": "DRF view `OpenCustomerInvoicesView` declares no `permission_classes` \u2014 backend/reports/views.py:822"}, "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-b091b86becc6b2d6", "name": "DRF view `OpenSupplierInvoicesView` declares no `permission_classes` \u2014 backend/reports/views.py:829", "shortDescription": {"text": "DRF view `OpenSupplierInvoicesView` declares no `permission_classes` \u2014 backend/reports/views.py:829"}, "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-0905dd10838e7ca8", "name": "DRF view `PayablesAgingView` declares no `permission_classes` \u2014 backend/reports/views.py:837", "shortDescription": {"text": "DRF view `PayablesAgingView` declares no `permission_classes` \u2014 backend/reports/views.py:837"}, "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-41dc40b3a6e2c04f", "name": "DRF view `BankBookView` declares no `permission_classes` \u2014 backend/reports/views.py:970", "shortDescription": {"text": "DRF view `BankBookView` declares no `permission_classes` \u2014 backend/reports/views.py:970"}, "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-3cd28ec0dd35ddf6", "name": "DRF view `CashBookView` declares no `permission_classes` \u2014 backend/reports/views.py:975", "shortDescription": {"text": "DRF view `CashBookView` declares no `permission_classes` \u2014 backend/reports/views.py:975"}, "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-676211ca9ae7fb4d", "name": "DRF view `DaybookView` declares no `permission_classes` \u2014 backend/reports/views.py:980", "shortDescription": {"text": "DRF view `DaybookView` declares no `permission_classes` \u2014 backend/reports/views.py:980"}, "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-74471dd9494cd432", "name": "DRF view `GSTComputationView` declares no `permission_classes` \u2014 backend/reports/views.py:1044", "shortDescription": {"text": "DRF view `GSTComputationView` declares no `permission_classes` \u2014 backend/reports/views.py:1044"}, "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-f3d3bdccdf3933b5", "name": "DRF view `HSNSummaryView` declares no `permission_classes` \u2014 backend/reports/views.py:1175", "shortDescription": {"text": "DRF view `HSNSummaryView` declares no `permission_classes` \u2014 backend/reports/views.py:1175"}, "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-4faebe15d3b5bc0f", "name": "DRF view `PartyOutstandingView` declares no `permission_classes` \u2014 backend/reports/views.py:1253", "shortDescription": {"text": "DRF view `PartyOutstandingView` declares no `permission_classes` \u2014 backend/reports/views.py:1253"}, "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-122072e932f2dd0e", "name": "DRF view `StockMovementSummaryView` declares no `permission_classes` \u2014 backend/reports/views.py:1331", "shortDescription": {"text": "DRF view `StockMovementSummaryView` declares no `permission_classes` \u2014 backend/reports/views.py:1331"}, "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-4924142e553738b0", "name": "DRF view `StockValuationView` declares no `permission_classes` \u2014 backend/reports/views.py:1456", "shortDescription": {"text": "DRF view `StockValuationView` declares no `permission_classes` \u2014 backend/reports/views.py:1456"}, "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-ea81f7695a84db27", "name": "DRF view `MSMEComplianceReportView` declares no `permission_classes` \u2014 backend/reports/views.py:1509", "shortDescription": {"text": "DRF view `MSMEComplianceReportView` declares no `permission_classes` \u2014 backend/reports/views.py:1509"}, "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-3f357575da867c7a", "name": "DRF view `FinancialRatiosView` declares no `permission_classes` \u2014 backend/reports/views.py:1610", "shortDescription": {"text": "DRF view `FinancialRatiosView` declares no `permission_classes` \u2014 backend/reports/views.py:1610"}, "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-da500cc16416dc8d", "name": "DRF view `BankReconciliationSummaryView` declares no `permission_classes` \u2014 backend/reports/views.py:1734", "shortDescription": {"text": "DRF view `BankReconciliationSummaryView` declares no `permission_classes` \u2014 backend/reports/views.py:1734"}, "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-74b73f110f6fecc8", "name": "DRF view `ClosingStockReconciliationView` declares no `permission_classes` \u2014 backend/reports/views.py:1815", "shortDescription": {"text": "DRF view `ClosingStockReconciliationView` declares no `permission_classes` \u2014 backend/reports/views.py:1815"}, "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-55db74870c268cc2", "name": "DRF view `AgedStockReportView` declares no `permission_classes` \u2014 backend/reports/views.py:1893", "shortDescription": {"text": "DRF view `AgedStockReportView` declares no `permission_classes` \u2014 backend/reports/views.py:1893"}, "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-d45bab04568d1093", "name": "DRF view `DepartmentalPLView` declares no `permission_classes` \u2014 backend/reports/views.py:1952", "shortDescription": {"text": "DRF view `DepartmentalPLView` declares no `permission_classes` \u2014 backend/reports/views.py:1952"}, "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-ebfdc8a4725c3064", "name": "DRF view `CashFlowStatementView` declares no `permission_classes` \u2014 backend/reports/views.py:2021", "shortDescription": {"text": "DRF view `CashFlowStatementView` declares no `permission_classes` \u2014 backend/reports/views.py:2021"}, "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-dae7cbd5b238465c", "name": "DRF view `GSTFilingHealthView` declares no `permission_classes` \u2014 backend/reports/views.py:2178", "shortDescription": {"text": "DRF view `GSTFilingHealthView` declares no `permission_classes` \u2014 backend/reports/views.py:2178"}, "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-269fa9ef24fa21f3", "name": "DRF view `LoanViewSet` declares no `permission_classes` \u2014 backend/loans/views.py:16", "shortDescription": {"text": "DRF view `LoanViewSet` declares no `permission_classes` \u2014 backend/loans/views.py:16"}, "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-672b723f69d37c07", "name": "DRF view `EMIPayView` declares no `permission_classes` \u2014 backend/loans/views.py:85", "shortDescription": {"text": "DRF view `EMIPayView` declares no `permission_classes` \u2014 backend/loans/views.py:85"}, "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-c2abf631546fbc03", "name": "DRF view `TDSRateConfigViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:22", "shortDescription": {"text": "DRF view `TDSRateConfigViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:22"}, "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-94a206d438de82e2", "name": "DRF view `TDSDeductionViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:30", "shortDescription": {"text": "DRF view `TDSDeductionViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:30"}, "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-13b5ce594bea810b", "name": "DRF view `TDSChallanViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:225", "shortDescription": {"text": "DRF view `TDSChallanViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:225"}, "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-7eb3fa328ad15950", "name": "DRF view `TCSCollectionViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:261", "shortDescription": {"text": "DRF view `TCSCollectionViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:261"}, "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-b9c2a5172b38ee4b", "name": "DRF view `Form26ASViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:287", "shortDescription": {"text": "DRF view `Form26ASViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:287"}, "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-a1d9ae90bca0d1bc", "name": "Unused endpoint: ANY /api/budgets/", "shortDescription": {"text": "Unused endpoint: ANY /api/budgets/"}, "fullDescription": {"text": "`backend/budgets/urls.py` declares `ANY /api/budgets/` 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-392099bbc887396e", "name": "Unused endpoint: ANY /api/budgets/budgets", "shortDescription": {"text": "Unused endpoint: ANY /api/budgets/budgets"}, "fullDescription": {"text": "`backend/budgets/urls.py` declares `ANY /api/budgets/budgets` 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-501c26e980a97c01", "name": "Unused endpoint: ANY /api/budgets/variance", "shortDescription": {"text": "Unused endpoint: ANY /api/budgets/variance"}, "fullDescription": {"text": "`backend/budgets/urls.py` declares `ANY /api/budgets/variance` 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/notifications/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-f427b2101ff6083e", "name": "Unused endpoint: ANY /api/notifications/preferences", "shortDescription": {"text": "Unused endpoint: ANY /api/notifications/preferences"}, "fullDescription": {"text": "`backend/notifications/urls.py` declares `ANY /api/notifications/preferences` 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-bd101b6b18116f4a", "name": "Unused endpoint: ANY /api/sync/run/", "shortDescription": {"text": "Unused endpoint: ANY /api/sync/run/"}, "fullDescription": {"text": "`backend/sync/urls.py` declares `ANY /api/sync/run/` 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-c9820c744382c01e", "name": "Unused endpoint: ANY /api/sync/logs/", "shortDescription": {"text": "Unused endpoint: ANY /api/sync/logs/"}, "fullDescription": {"text": "`backend/sync/urls.py` declares `ANY /api/sync/logs/` 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-372fc7dd79818a21", "name": "Unused endpoint: ANY /api/sync/retry/", "shortDescription": {"text": "Unused endpoint: ANY /api/sync/retry/"}, "fullDescription": {"text": "`backend/sync/urls.py` declares `ANY /api/sync/retry/` 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-4900db837f64f5d7", "name": "Unused endpoint: ANY /api/sync/errors/", "shortDescription": {"text": "Unused endpoint: ANY /api/sync/errors/"}, "fullDescription": {"text": "`backend/sync/urls.py` declares `ANY /api/sync/errors/` 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-5b17f0822dc94bb0", "name": "Unused endpoint: ANY /api/sync/errors/<int:pk>/resolve/", "shortDescription": {"text": "Unused endpoint: ANY /api/sync/errors/<int:pk>/resolve/"}, "fullDescription": {"text": "`backend/sync/urls.py` declares `ANY /api/sync/errors/<int:pk>/resolve/` 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-a7c0db36f99f9286", "name": "Unused endpoint: ANY /api/sync/full-resync/", "shortDescription": {"text": "Unused endpoint: ANY /api/sync/full-resync/"}, "fullDescription": {"text": "`backend/sync/urls.py` declares `ANY /api/sync/full-resync/` 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-20b58943b2bd68f7", "name": "Unused endpoint: ANY /api/gst/grand-summary/", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/grand-summary/"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/grand-summary/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8a40a9c21600bbc", "name": "Unused endpoint: ANY /api/gst/gstr1", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/gstr1"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/gstr1` 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-b83d18ff46bde103", "name": "Unused endpoint: ANY /api/gst/gstr1-hsn", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/gstr1-hsn"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/gstr1-hsn` 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-cfe428fd11b07198", "name": "Unused endpoint: ANY /api/gst/gstr3b", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/gstr3b"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/gstr3b` 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-f83cf442f883bb16", "name": "Unused endpoint: ANY /api/gst/gstr2b", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/gstr2b"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/gstr2b` 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-76ed2d3c303d90ef", "name": "Unused endpoint: ANY /api/gst/itc-reconciliation", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/itc-reconciliation"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/itc-reconciliation` 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-e2906e8971c8dda8", "name": "Unused endpoint: ANY /api/gst/rcm", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/rcm"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/rcm` 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-88493b5ccc2139cc", "name": "Unused endpoint: ANY /api/gst/setoff-preview", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/setoff-preview"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/setoff-preview` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f446cbdf394af66e", "name": "Unused endpoint: ANY /api/gst/gstr9", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/gstr9"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/gstr9` 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-176a68d3e612e0bd", "name": "Unused endpoint: ANY /api/gst/gstr9c", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/gstr9c"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/gstr9c` 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-bdd5d25e0a3143dc", "name": "Unused endpoint: ANY /api/gst/late-fee", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/late-fee"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/late-fee` 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-0d995ae03bcb1efd", "name": "Unused endpoint: ANY /api/gst/eway-bills", "shortDescription": {"text": "Unused endpoint: ANY /api/gst/eway-bills"}, "fullDescription": {"text": "`backend/gst_returns/urls.py` declares `ANY /api/gst/eway-bills` 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-09ecf823fba61917", "name": "Unused endpoint: ANY /api/journals/entries", "shortDescription": {"text": "Unused endpoint: ANY /api/journals/entries"}, "fullDescription": {"text": "`backend/journals/urls.py` declares `ANY /api/journals/entries` 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-356bdc6f791e8c84", "name": "Unused endpoint: ANY /api/journals/recurring", "shortDescription": {"text": "Unused endpoint: ANY /api/journals/recurring"}, "fullDescription": {"text": "`backend/journals/urls.py` declares `ANY /api/journals/recurring` 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-f721f61ea6e304d6", "name": "Unused endpoint: ANY /api/journals/bill-references", "shortDescription": {"text": "Unused endpoint: ANY /api/journals/bill-references"}, "fullDescription": {"text": "`backend/journals/urls.py` declares `ANY /api/journals/bill-references` 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-dd05edd8581d3eb2", "name": "Unused endpoint: ANY /api/journals/voucher-types", "shortDescription": {"text": "Unused endpoint: ANY /api/journals/voucher-types"}, "fullDescription": {"text": "`backend/journals/urls.py` declares `ANY /api/journals/voucher-types` 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-55d7b445a7638743", "name": "Unused endpoint: ANY /api/audit/", "shortDescription": {"text": "Unused endpoint: ANY /api/audit/"}, "fullDescription": {"text": "`backend/audit/urls.py` declares `ANY /api/audit/` 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-cbaf09d262293121", "name": "Unused endpoint: ANY /api/audit/export-csv/", "shortDescription": {"text": "Unused endpoint: ANY /api/audit/export-csv/"}, "fullDescription": {"text": "`backend/audit/urls.py` declares `ANY /api/audit/export-csv/` 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-555dc727c02bf080", "name": "Unused endpoint: ANY /api/audit/verify-chain/", "shortDescription": {"text": "Unused endpoint: ANY /api/audit/verify-chain/"}, "fullDescription": {"text": "`backend/audit/urls.py` declares `ANY /api/audit/verify-chain/` 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-e96c708b2b777d83", "name": "Unused endpoint: ANY /api/bills/", "shortDescription": {"text": "Unused endpoint: ANY /api/bills/"}, "fullDescription": {"text": "`backend/bills/urls.py` declares `ANY /api/bills/` 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-1f56e1205f5f324f", "name": "Unused endpoint: ANY /api/bills/bills", "shortDescription": {"text": "Unused endpoint: ANY /api/bills/bills"}, "fullDescription": {"text": "`backend/bills/urls.py` declares `ANY /api/bills/bills` 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-9d02d76656c28499", "name": "Unused endpoint: ANY /api/bills/recurring", "shortDescription": {"text": "Unused endpoint: ANY /api/bills/recurring"}, "fullDescription": {"text": "`backend/bills/urls.py` declares `ANY /api/bills/recurring` 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-f9a31f400ad9955a", "name": "Unused endpoint: ANY /api/bills/payments", "shortDescription": {"text": "Unused endpoint: ANY /api/bills/payments"}, "fullDescription": {"text": "`backend/bills/urls.py` declares `ANY /api/bills/payments` 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-0eed1c474ee43c40", "name": "Unused endpoint: ANY /api/bills/attachments", "shortDescription": {"text": "Unused endpoint: ANY /api/bills/attachments"}, "fullDescription": {"text": "`backend/bills/urls.py` declares `ANY /api/bills/attachments` 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-7860c5b39149eae0", "name": "Unused endpoint: ANY /api/payroll/", "shortDescription": {"text": "Unused endpoint: ANY /api/payroll/"}, "fullDescription": {"text": "`backend/payroll/urls.py` declares `ANY /api/payroll/` 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-5d046d5357ebdcf6", "name": "Unused endpoint: ANY /api/payroll/employees", "shortDescription": {"text": "Unused endpoint: ANY /api/payroll/employees"}, "fullDescription": {"text": "`backend/payroll/urls.py` declares `ANY /api/payroll/employees` 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-ad3a9b4534d35cb0", "name": "Unused endpoint: ANY /api/payroll/salary-structures", "shortDescription": {"text": "Unused endpoint: ANY /api/payroll/salary-structures"}, "fullDescription": {"text": "`backend/payroll/urls.py` declares `ANY /api/payroll/salary-structures` 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-763db9597a0c447e", "name": "Unused endpoint: ANY /api/payroll/runs", "shortDescription": {"text": "Unused endpoint: ANY /api/payroll/runs"}, "fullDescription": {"text": "`backend/payroll/urls.py` declares `ANY /api/payroll/runs` 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-be343aba7254b063", "name": "Unused endpoint: ANY /api/banking/", "shortDescription": {"text": "Unused endpoint: ANY /api/banking/"}, "fullDescription": {"text": "`backend/banking/urls.py` declares `ANY /api/banking/` 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-d57c5a210a4a6006", "name": "Unused endpoint: ANY /api/banking/accounts", "shortDescription": {"text": "Unused endpoint: ANY /api/banking/accounts"}, "fullDescription": {"text": "`backend/banking/urls.py` declares `ANY /api/banking/accounts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-75717d2190affcd9", "name": "Unused endpoint: ANY /api/banking/transactions", "shortDescription": {"text": "Unused endpoint: ANY /api/banking/transactions"}, "fullDescription": {"text": "`backend/banking/urls.py` declares `ANY /api/banking/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-f88b9eeb9512c4c4", "name": "Unused endpoint: ANY /api/banking/cheques", "shortDescription": {"text": "Unused endpoint: ANY /api/banking/cheques"}, "fullDescription": {"text": "`backend/banking/urls.py` declares `ANY /api/banking/cheques` 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-1f110992bb736703", "name": "Unused endpoint: ANY /api/banking/petty-cash", "shortDescription": {"text": "Unused endpoint: ANY /api/banking/petty-cash"}, "fullDescription": {"text": "`backend/banking/urls.py` declares `ANY /api/banking/petty-cash` 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-ec6a16d49277a278", "name": "Unused endpoint: ANY /api/fixed-assets/", "shortDescription": {"text": "Unused endpoint: ANY /api/fixed-assets/"}, "fullDescription": {"text": "`backend/fixed_assets/urls.py` declares `ANY /api/fixed-assets/` 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-5cee89557fd676e9", "name": "Unused endpoint: ANY /api/fixed-assets/classes", "shortDescription": {"text": "Unused endpoint: ANY /api/fixed-assets/classes"}, "fullDescription": {"text": "`backend/fixed_assets/urls.py` declares `ANY /api/fixed-assets/classes` 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-3687437fde6748fd", "name": "Unused endpoint: ANY /api/fixed-assets/assets", "shortDescription": {"text": "Unused endpoint: ANY /api/fixed-assets/assets"}, "fullDescription": {"text": "`backend/fixed_assets/urls.py` declares `ANY /api/fixed-assets/assets` 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-1982b545290c4ab0", "name": "Unused endpoint: ANY /api/fixed-assets/depreciation", "shortDescription": {"text": "Unused endpoint: ANY /api/fixed-assets/depreciation"}, "fullDescription": {"text": "`backend/fixed_assets/urls.py` declares `ANY /api/fixed-assets/depreciation` 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/expenses/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-c13695d53a0ccb03", "name": "Unused endpoint: ANY /api/expenses/expenses", "shortDescription": {"text": "Unused endpoint: ANY /api/expenses/expenses"}, "fullDescription": {"text": "`backend/expenses/urls.py` declares `ANY /api/expenses/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}}]}}, "automationDetails": {"id": "repobility/18755"}, "properties": {"repository": "SaheerLulu/healthcare-accounting", "repoUrl": "https://github.com/SaheerLulu/healthcare-accounting", "branch": "main"}, "results": [{"ruleId": "scanner-15c87d897b36765e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CommandPalette.tsx:223"}, "properties": {"repobilityId": "6c9536975aad41c4", "scanner": "scanner-primary", "fingerprint": "15c87d897b36765e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73fee242652f92c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Layout.tsx:279"}, "properties": {"repobilityId": "4d0ca9e37bee02cd", "scanner": "scanner-primary", "fingerprint": "73fee242652f92c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-714ac9d3a0a32be2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/KpiCard.tsx:93"}, "properties": {"repobilityId": "1d55630b35c5b43b", "scanner": "scanner-primary", "fingerprint": "714ac9d3a0a32be2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bbce5800e164814", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/MasterPage.tsx:36"}, "properties": {"repobilityId": "2f1bca7cb141fd1c", "scanner": "scanner-primary", "fingerprint": "1bbce5800e164814", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d1bf46d10e0285f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/JournalsPage.tsx:228"}, "properties": {"repobilityId": "1f159f61e1997d53", "scanner": "scanner-primary", "fingerprint": "2d1bf46d10e0285f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a9926ee16481ab9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SettingsPage.tsx:420"}, "properties": {"repobilityId": "44a7002df62c85a0", "scanner": "scanner-primary", "fingerprint": "9a9926ee16481ab9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ca1888b0f6f1811", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/GatewayPage.tsx:126"}, "properties": {"repobilityId": "e22acea4ac50e39e", "scanner": "scanner-primary", "fingerprint": "7ca1888b0f6f1811", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42f2a7886e8d50c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/journals/AccountPicker.tsx:206"}, "properties": {"repobilityId": "2e677fc2392e24b3", "scanner": "scanner-primary", "fingerprint": "42f2a7886e8d50c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc3aea44da83e2ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/bills/BillDetailPage.tsx:602"}, "properties": {"repobilityId": "5ccbe74d612ca0e7", "scanner": "scanner-primary", "fingerprint": "dc3aea44da83e2ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4e06bc070d8aa91", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/vouchers/PaymentRowEditor.tsx:84"}, "properties": {"repobilityId": "1030b9c2afe13dcc", "scanner": "scanner-primary", "fingerprint": "e4e06bc070d8aa91", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c8309e726f5a870", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/vouchers/InvoiceAllocationGrid.tsx:146"}, "properties": {"repobilityId": "675744ad33bde31b", "scanner": "scanner-primary", "fingerprint": "2c8309e726f5a870", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-47f85cc72ca2b1fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/vouchers/SimplePaymentVoucher.tsx:721"}, "properties": {"repobilityId": "4ac29fbface25f55", "scanner": "scanner-primary", "fingerprint": "47f85cc72ca2b1fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af8ddf53840b452c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/banking/BankingPage.tsx:97"}, "properties": {"repobilityId": "f2addd8bf99404bd", "scanner": "scanner-primary", "fingerprint": "af8ddf53840b452c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-66c26c38b7bf4913", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/banking/BankAccountPage.tsx:235"}, "properties": {"repobilityId": "a4cfb904a59de488", "scanner": "scanner-primary", "fingerprint": "66c26c38b7bf4913", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40ae2ffc8212764d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/expenses/ExpenseDetailPage.tsx:317"}, "properties": {"repobilityId": "fe3cbfa894f43248", "scanner": "scanner-primary", "fingerprint": "40ae2ffc8212764d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbd8ce149f918aca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/parties/PartySearchPicker.tsx:171"}, "properties": {"repobilityId": "3c348c71b63fb01d", "scanner": "scanner-primary", "fingerprint": "cbd8ce149f918aca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19d46b2c1f3fd18b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/parties/PartyDetailPage.tsx:453"}, "properties": {"repobilityId": "84c4981de744b132", "scanner": "scanner-primary", "fingerprint": "19d46b2c1f3fd18b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1edafb0965ea92e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/LedgerPage.tsx:195"}, "properties": {"repobilityId": "c593e5679773329a", "scanner": "scanner-primary", "fingerprint": "d1edafb0965ea92e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf58c99441279421", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/DaybookPage.tsx:56"}, "properties": {"repobilityId": "c7cd1ea16785e21d", "scanner": "scanner-primary", "fingerprint": "cf58c99441279421", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6ea2a0297a4f859", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/BankBookPage.tsx:113"}, "properties": {"repobilityId": "701507dcc37ae3de", "scanner": "scanner-primary", "fingerprint": "d6ea2a0297a4f859", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9dbae616ae136ee8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/CashBookPage.tsx:113"}, "properties": {"repobilityId": "3e25768eda070122", "scanner": "scanner-primary", "fingerprint": "9dbae616ae136ee8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2a5d995e298960c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/reports/HSNSummaryPage.tsx:145"}, "properties": {"repobilityId": "1aed4473ee6af785", "scanner": "scanner-primary", "fingerprint": "b2a5d995e298960c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60427b03771411b6", "level": "warning", "message": {"text": "Dockerfile runs as root: frontend/Dockerfile"}, "properties": {"repobilityId": "735c01d8531dfd2c", "scanner": "scanner-primary", "fingerprint": "60427b03771411b6", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-faa134129e5545ff", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "335286791b6195f7", "scanner": "scanner-primary", "fingerprint": "faa134129e5545ff", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-b048d166901fd868", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine"}, "properties": {"repobilityId": "8f78aab70515291d", "scanner": "scanner-primary", "fingerprint": "b048d166901fd868", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-714c31ca9f474ae6", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "75f0510bad6d3b11", "scanner": "scanner-primary", "fingerprint": "714c31ca9f474ae6", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-9bbbfd90508d46c1", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/pages/LoginPage.tsx:31"}, "properties": {"repobilityId": "b9e1c62b8cdf6f86", "scanner": "scanner-primary", "fingerprint": "9bbbfd90508d46c1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/LoginPage.tsx"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-ca9c9ae125359f8f", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "71bb4bd84c43c996", "scanner": "scanner-primary", "fingerprint": "ca9c9ae125359f8f", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-dev.yml"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-ca9c9ae125359f8f", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1505750559eee4c9", "scanner": "scanner-primary", "fingerprint": "ca9c9ae125359f8f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-dev.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-ca9c9ae125359f8f", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "11863584a20fe735", "scanner": "scanner-primary", "fingerprint": "ca9c9ae125359f8f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-dev.yml"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-2ea85dd12d07c78a", "level": "note", "message": {"text": "Very large file: frontend/src/lib/api.ts (2624 lines)"}, "properties": {"repobilityId": "be9b0901f516ad7b", "scanner": "scanner-primary", "fingerprint": "2ea85dd12d07c78a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-44b06caf27c537c4", "level": "note", "message": {"text": "Very large file: backend/journals/services.py (1764 lines)"}, "properties": {"repobilityId": "57bb3957ecf0739b", "scanner": "scanner-primary", "fingerprint": "44b06caf27c537c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3cbeee26d0cf4e53", "level": "note", "message": {"text": "Very large file: backend/reports/views.py (2522 lines)"}, "properties": {"repobilityId": "4694796d67f3c754", "scanner": "scanner-primary", "fingerprint": "3cbeee26d0cf4e53", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "e3c60ee1b6c34517", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "3bdd0ef40aae0143", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "69fe23dd6239ea90", "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": "f4beb1eb3904162e", "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": "13681951809e8b75", "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": "73cda516da2a2a6c", "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": "27bf98dd5e18d66a", "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": "c531867dc41d7787", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-f29253e4bd148aa5", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/vite.config.ts:10"}, "properties": {"repobilityId": "badc9e9da18850a9", "scanner": "scanner-primary", "fingerprint": "f29253e4bd148aa5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d925869d6f021611", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/Layout.tsx:50"}, "properties": {"repobilityId": "bc560440a3986851", "scanner": "scanner-primary", "fingerprint": "d925869d6f021611", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bdd925cd49429dd3", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/SettingsPage.tsx:232"}, "properties": {"repobilityId": "3216e3d58a41d045", "scanner": "scanner-primary", "fingerprint": "bdd925cd49429dd3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3175d54793c9733b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/vouchers/VoucherEditor.tsx:207"}, "properties": {"repobilityId": "98a99d911fd620aa", "scanner": "scanner-primary", "fingerprint": "3175d54793c9733b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a91a31baa475df9", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/vouchers/SimplePaymentVoucher.tsx:260"}, "properties": {"repobilityId": "7e2616bba699c33d", "scanner": "scanner-primary", "fingerprint": "8a91a31baa475df9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39682b8e932fa9ad", "level": "note", "message": {"text": "Legacy-named symbol `days_old` in backend/notifications/services.py:150"}, "properties": {"repobilityId": "462e590eaef76580", "scanner": "scanner-primary", "fingerprint": "39682b8e932fa9ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b684531f22035740", "level": "warning", "message": {"text": "Likely N+1 query: `for emi in \u2026` triggers a query per row \u2014 backend/notifications/services.py:98"}, "properties": {"repobilityId": "c2da61e6ae7052f9", "scanner": "scanner-primary", "fingerprint": "b684531f22035740", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/notifications/services.py"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-39fbe36fd47e11f0", "level": "warning", "message": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/notifications/services.py:150"}, "properties": {"repobilityId": "b1956ba5a7b6184f", "scanner": "scanner-primary", "fingerprint": "39fbe36fd47e11f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/notifications/services.py"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-472c608a42f97240", "level": "warning", "message": {"text": "Likely N+1 query: `for cheque in \u2026` triggers a query per row \u2014 backend/notifications/services.py:183"}, "properties": {"repobilityId": "585b98703952d907", "scanner": "scanner-primary", "fingerprint": "472c608a42f97240", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/notifications/services.py"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-99b01a5b75a84612", "level": "warning", "message": {"text": "Likely N+1 query: `for lock in \u2026` triggers a query per row \u2014 backend/notifications/services.py:226"}, "properties": {"repobilityId": "71c573a1f2b7a96e", "scanner": "scanner-primary", "fingerprint": "99b01a5b75a84612", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/notifications/services.py"}, "region": {"startLine": 226}}}]}, {"ruleId": "scanner-ddfb423abadf94f9", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/sync/services.py:18"}, "properties": {"repobilityId": "57db6fba041f4264", "scanner": "scanner-primary", "fingerprint": "ddfb423abadf94f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dfc8aff15e0fc7cd", "level": "warning", "message": {"text": "Likely N+1 query: `for e in \u2026` triggers a query per row \u2014 backend/gst_returns/views.py:209"}, "properties": {"repobilityId": "1dc98cfaa3533940", "scanner": "scanner-primary", "fingerprint": "dfc8aff15e0fc7cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 209}}}]}, {"ruleId": "scanner-c710c35b15f280a0", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/gst_returns/services.py:131"}, "properties": {"repobilityId": "a933c25b6fdf71b8", "scanner": "scanner-primary", "fingerprint": "c710c35b15f280a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c08ea57b723a11d0", "level": "warning", "message": {"text": "Likely N+1 query: `for pos in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:139"}, "properties": {"repobilityId": "b44c95d8bcbd6541", "scanner": "scanner-primary", "fingerprint": "c08ea57b723a11d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/services.py"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-141d4edb2f5ca6f9", "level": "warning", "message": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:199"}, "properties": {"repobilityId": "1ca3796a5e10b831", "scanner": "scanner-primary", "fingerprint": "141d4edb2f5ca6f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/services.py"}, "region": {"startLine": 199}}}]}, {"ruleId": "scanner-48c5d0b8c3e03377", "level": "warning", "message": {"text": "Likely N+1 query: `for order in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:225"}, "properties": {"repobilityId": "c56ba00c8520c9fb", "scanner": "scanner-primary", "fingerprint": "48c5d0b8c3e03377", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/services.py"}, "region": {"startLine": 225}}}]}, {"ruleId": "scanner-f33f5398b35be236", "level": "warning", "message": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:285"}, "properties": {"repobilityId": "8e6602ec5c33ab40", "scanner": "scanner-primary", "fingerprint": "f33f5398b35be236", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/services.py"}, "region": {"startLine": 285}}}]}, {"ruleId": "scanner-a2cd15c46d782d55", "level": "warning", "message": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:410"}, "properties": {"repobilityId": "d0323781b9e6cd24", "scanner": "scanner-primary", "fingerprint": "a2cd15c46d782d55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/services.py"}, "region": {"startLine": 410}}}]}, {"ruleId": "scanner-29dfbfb760ad77bb", "level": "warning", "message": {"text": "Likely N+1 query: `for po in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:598"}, "properties": {"repobilityId": "d4f0df921dfd563a", "scanner": "scanner-primary", "fingerprint": "29dfbfb760ad77bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/services.py"}, "region": {"startLine": 598}}}]}, {"ruleId": "scanner-57678ca841821caf", "level": "warning", "message": {"text": "Likely N+1 query: `for je in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:869"}, "properties": {"repobilityId": "e1d82b2c71fcf35b", "scanner": "scanner-primary", "fingerprint": "57678ca841821caf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/services.py"}, "region": {"startLine": 869}}}]}, {"ruleId": "scanner-b5dd149f70ecf5a0", "level": "warning", "message": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/gst_returns/services.py:882"}, "properties": {"repobilityId": "96cf1183e4573e1b", "scanner": "scanner-primary", "fingerprint": "b5dd149f70ecf5a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/services.py"}, "region": {"startLine": 882}}}]}, {"ruleId": "scanner-b875d65cc6e715fc", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/gst_returns/annual_return.py:72"}, "properties": {"repobilityId": "94f052cffd21ce74", "scanner": "scanner-primary", "fingerprint": "b875d65cc6e715fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9363221c7bf37371", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/journals/serializers.py:288"}, "properties": {"repobilityId": "99206a600391d8ba", "scanner": "scanner-primary", "fingerprint": "9363221c7bf37371", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b622a5dff3a32777", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/journals/views.py:245"}, "properties": {"repobilityId": "00e616f4c5932db9", "scanner": "scanner-primary", "fingerprint": "b622a5dff3a32777", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-747bf150a535fdd2", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/journals/services.py:45"}, "properties": {"repobilityId": "864a060a3e93ac93", "scanner": "scanner-primary", "fingerprint": "747bf150a535fdd2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-345fdabeb3f348cb", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/journals/models.py:282"}, "properties": {"repobilityId": "4cd045005332a8ef", "scanner": "scanner-primary", "fingerprint": "345fdabeb3f348cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67fba3416876a600", "level": "warning", "message": {"text": "Likely N+1 query: `for row in \u2026` triggers a query per row \u2014 backend/audit/views.py:74"}, "properties": {"repobilityId": "1eacd9a540a945f9", "scanner": "scanner-primary", "fingerprint": "67fba3416876a600", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/audit/views.py"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-2070b06af6f6635a", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/bills/services.py:338"}, "properties": {"repobilityId": "36acabb29d452aa8", "scanner": "scanner-primary", "fingerprint": "2070b06af6f6635a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a23096c6d87f55e", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/expenses/serializers.py:22"}, "properties": {"repobilityId": "da542f1f053652ba", "scanner": "scanner-primary", "fingerprint": "8a23096c6d87f55e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e88a245922504bce", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/parties/views.py:293"}, "properties": {"repobilityId": "f63b9de7f9e7f53d", "scanner": "scanner-primary", "fingerprint": "e88a245922504bce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-910126db3d4da4e1", "level": "warning", "message": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/parties/services.py:225"}, "properties": {"repobilityId": "0f882223723b4f62", "scanner": "scanner-primary", "fingerprint": "910126db3d4da4e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/services.py"}, "region": {"startLine": 225}}}]}, {"ruleId": "scanner-d91d22f87342860e", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/parties/models.py:81"}, "properties": {"repobilityId": "3be8ac6e90b2984a", "scanner": "scanner-primary", "fingerprint": "d91d22f87342860e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-261cb01e5f516f4a", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/core/serializers.py:84"}, "properties": {"repobilityId": "52997cc88175feeb", "scanner": "scanner-primary", "fingerprint": "261cb01e5f516f4a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33484d9ca62e6e24", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/core/year_end.py:185"}, "properties": {"repobilityId": "93f45c9e7961279b", "scanner": "scanner-primary", "fingerprint": "33484d9ca62e6e24", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f6e9b1f85119c06", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/core/period_lock.py:84"}, "properties": {"repobilityId": "3cd4d009e54d15f8", "scanner": "scanner-primary", "fingerprint": "3f6e9b1f85119c06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2028e4b6b859c224", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/core/models.py:88"}, "properties": {"repobilityId": "ba730df529c6161b", "scanner": "scanner-primary", "fingerprint": "2028e4b6b859c224", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-046c7cb81a10eaa8", "level": "warning", "message": {"text": "Likely N+1 query: `for rel in \u2026` triggers a query per row \u2014 backend/core/management/commands/prune_unused_accounts.py:37"}, "properties": {"repobilityId": "0bd8ae4620130fae", "scanner": "scanner-primary", "fingerprint": "046c7cb81a10eaa8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/management/commands/prune_unused_accounts.py"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-bc24f3d4450cb8cc", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 backend/core/management/commands/backup_db.py:60"}, "properties": {"repobilityId": "e9f197cbed566dfa", "scanner": "scanner-primary", "fingerprint": "bc24f3d4450cb8cc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e50bf704824e200c", "level": "warning", "message": {"text": "Likely N+1 query: `for bill in \u2026` triggers a query per row \u2014 backend/core/management/commands/cleanup_untagged_manual_jvs.py:240"}, "properties": {"repobilityId": "a2bb35eeae9683e9", "scanner": "scanner-primary", "fingerprint": "e50bf704824e200c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/management/commands/cleanup_untagged_manual_jvs.py"}, "region": {"startLine": 240}}}]}, {"ruleId": "scanner-3c57936568bb6fe0", "level": "note", "message": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/core/migrations/0025_sales_income_mappings.py:65"}, "properties": {"repobilityId": "d1fdf67cef22fd05", "scanner": "scanner-primary", "fingerprint": "3c57936568bb6fe0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-40f4dab8a27ecffe", "level": "note", "message": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/core/migrations/0021_losses_to_indirect_expenses.py:43"}, "properties": {"repobilityId": "97e47d9d52fecc4d", "scanner": "scanner-primary", "fingerprint": "40f4dab8a27ecffe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-1bd1608d41726af3", "level": "note", "message": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/core/migrations/0022_petty_cash_expense_account.py:42"}, "properties": {"repobilityId": "7dae0c7bc9e137f2", "scanner": "scanner-primary", "fingerprint": "1bd1608d41726af3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-4054a2b4186b0061", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/reports/views.py:248"}, "properties": {"repobilityId": "57a134160c3fc59e", "scanner": "scanner-primary", "fingerprint": "4054a2b4186b0061", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e50373f44232133a", "level": "warning", "message": {"text": "Likely N+1 query: `for entry in \u2026` triggers a query per row \u2014 backend/reports/views.py:1009"}, "properties": {"repobilityId": "54a6b84102207e10", "scanner": "scanner-primary", "fingerprint": "e50373f44232133a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1009}}}]}, {"ruleId": "scanner-934a5bc48d973229", "level": "warning", "message": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/reports/views.py:1011"}, "properties": {"repobilityId": "ee34abdd88aaab84", "scanner": "scanner-primary", "fingerprint": "934a5bc48d973229", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1011}}}]}, {"ruleId": "scanner-5f8998c618b96391", "level": "warning", "message": {"text": "Likely N+1 query: `for line in \u2026` triggers a query per row \u2014 backend/reports/views.py:1561"}, "properties": {"repobilityId": "4d27dcb23ed5b803", "scanner": "scanner-primary", "fingerprint": "5f8998c618b96391", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1561}}}]}, {"ruleId": "scanner-3152962c110681dc", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/accounting_project/settings/base.py:286"}, "properties": {"repobilityId": "9f95820b87c8e3c8", "scanner": "scanner-primary", "fingerprint": "3152962c110681dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23699df8ae345d3d", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/loans/views.py:31"}, "properties": {"repobilityId": "399d61823f9ed8be", "scanner": "scanner-primary", "fingerprint": "23699df8ae345d3d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b12f5ef8b70e9a95", "level": "warning", "message": {"text": "Likely N+1 query: `for row in \u2026` triggers a query per row \u2014 backend/tds/views.py:340"}, "properties": {"repobilityId": "a7de57bbbd3b1b9e", "scanner": "scanner-primary", "fingerprint": "b12f5ef8b70e9a95", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/tds/views.py"}, "region": {"startLine": 340}}}]}, {"ruleId": "scanner-2132f0de460c117f", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/tds/services.py:457"}, "properties": {"repobilityId": "61e15b8c513a1f7b", "scanner": "scanner-primary", "fingerprint": "2132f0de460c117f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-472a629f408061b2", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/tds/tests/test_tcs.py:43"}, "properties": {"repobilityId": "e30a36a244725fb0", "scanner": "scanner-primary", "fingerprint": "472a629f408061b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "db1acbb22458af82", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "ad035c7cb249a301", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "003dc4f8d0ec366d", "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": "9ebc5dca4bda65c5", "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": "25d0d4ef3d4d1cd4", "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": "36a945fbe7ba537d", "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": "836b5457251f4b6a", "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": "bc06374c51602a8f", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "8e7a95b97bca431e", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "921ec0e8f71c3ba4", "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": "e89584c5fb94d822", "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": "54c37091e489816e", "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": "caa9a4b84b84204e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "2dbe878d3fa43493", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "c52d21007e15a782", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "16967ed79edfe599", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "9dae59cc9dd4e53c", "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": "9c31df12f268da4f", "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": "6cbf5cf57a0b6e91", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "6cd2043ce5d253ef", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-8e11138a9f634ca9", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "c97671d7cb9bdc13", "scanner": "scanner-primary", "fingerprint": "8e11138a9f634ca9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-06fd8c2abcd9399b", "level": "warning", "message": {"text": "Frontend route `accounts` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "0ef0e2566b426c8e", "scanner": "scanner-primary", "fingerprint": "06fd8c2abcd9399b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-55df395c2c021ea7", "level": "warning", "message": {"text": "Frontend route `journals` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "0810392fae7e3190", "scanner": "scanner-primary", "fingerprint": "55df395c2c021ea7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9305104432b6a6d2", "level": "warning", "message": {"text": "Frontend route `journals/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "43e430cea68d1df3", "scanner": "scanner-primary", "fingerprint": "9305104432b6a6d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-16f4a3e751f52195", "level": "warning", "message": {"text": "Frontend route `vouchers/payment` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "25d062772ef7f075", "scanner": "scanner-primary", "fingerprint": "16f4a3e751f52195", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6089614e18b4db7f", "level": "warning", "message": {"text": "Frontend route `vouchers/payment/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "b2fc5e08742c3f44", "scanner": "scanner-primary", "fingerprint": "6089614e18b4db7f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1d8c3d3358abb78c", "level": "warning", "message": {"text": "Frontend route `vouchers/receipt` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "70abdeaabf184f9a", "scanner": "scanner-primary", "fingerprint": "1d8c3d3358abb78c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-83fab924fc8b739d", "level": "warning", "message": {"text": "Frontend route `vouchers/receipt/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "be01f19a5447c855", "scanner": "scanner-primary", "fingerprint": "83fab924fc8b739d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-461b429bd694074f", "level": "warning", "message": {"text": "Frontend route `vouchers/contra` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "b1a4fb2f15ec7500", "scanner": "scanner-primary", "fingerprint": "461b429bd694074f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-27ba12d264966c92", "level": "warning", "message": {"text": "Frontend route `vouchers/contra/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "3c4b186ab9394160", "scanner": "scanner-primary", "fingerprint": "27ba12d264966c92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-63b031fc8d8ed12a", "level": "warning", "message": {"text": "Frontend route `vouchers/journal` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "3eb6607005e220bd", "scanner": "scanner-primary", "fingerprint": "63b031fc8d8ed12a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e93b356dbb33a139", "level": "warning", "message": {"text": "Frontend route `vouchers/journal/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d06195eb0cd048b2", "scanner": "scanner-primary", "fingerprint": "e93b356dbb33a139", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d5821f31d9d2b9fe", "level": "warning", "message": {"text": "Frontend route `vouchers/sales` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "a2336cb5fa56967e", "scanner": "scanner-primary", "fingerprint": "d5821f31d9d2b9fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c1113acfeaaa6fb8", "level": "warning", "message": {"text": "Frontend route `vouchers/sales/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "62e0b7928cee6f17", "scanner": "scanner-primary", "fingerprint": "c1113acfeaaa6fb8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-eb3638c0706a75c0", "level": "warning", "message": {"text": "Frontend route `vouchers/purchase` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "5856fcae7309c63e", "scanner": "scanner-primary", "fingerprint": "eb3638c0706a75c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0d0be8e8a18951a5", "level": "warning", "message": {"text": "Frontend route `vouchers/purchase/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "49f8c2fc5340580e", "scanner": "scanner-primary", "fingerprint": "0d0be8e8a18951a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5804e65947dfc8ba", "level": "warning", "message": {"text": "Frontend route `vouchers/credit-note` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "711671ca64cc305d", "scanner": "scanner-primary", "fingerprint": "5804e65947dfc8ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a3fc3e15f6ddaf0e", "level": "warning", "message": {"text": "Frontend route `vouchers/credit-note/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "373c02d0efc801d8", "scanner": "scanner-primary", "fingerprint": "a3fc3e15f6ddaf0e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2b4b2a583f10ac8f", "level": "warning", "message": {"text": "Frontend route `vouchers/debit-note` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "55415b96c6b635e7", "scanner": "scanner-primary", "fingerprint": "2b4b2a583f10ac8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f4615badd5bdca8f", "level": "warning", "message": {"text": "Frontend route `vouchers/debit-note/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "2411d5e14bccfd64", "scanner": "scanner-primary", "fingerprint": "f4615badd5bdca8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-833db13a05ffd56e", "level": "warning", "message": {"text": "Frontend route `journals/recurring` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "3d96a9ac5ef231eb", "scanner": "scanner-primary", "fingerprint": "833db13a05ffd56e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4631f4e89ea8a3d6", "level": "warning", "message": {"text": "Frontend route `journals/recurring/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "efe6502094d4e555", "scanner": "scanner-primary", "fingerprint": "4631f4e89ea8a3d6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-14abf36fe722fd74", "level": "warning", "message": {"text": "Frontend route `journals/recurring/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "71d5a63814c12c19", "scanner": "scanner-primary", "fingerprint": "14abf36fe722fd74", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-509cd8534e66a2c8", "level": "warning", "message": {"text": "Frontend route `journals/recurring/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "46958212e8ff4836", "scanner": "scanner-primary", "fingerprint": "509cd8534e66a2c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9ff4fabb06a21437", "level": "warning", "message": {"text": "Frontend route `journals/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "139a05f6b7bc6b16", "scanner": "scanner-primary", "fingerprint": "9ff4fabb06a21437", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d7f6833e3a8b7f85", "level": "warning", "message": {"text": "Frontend route `journals/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "e5609ab8679b00c9", "scanner": "scanner-primary", "fingerprint": "d7f6833e3a8b7f85", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-601bb0d53928e165", "level": "warning", "message": {"text": "Frontend route `bills` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "20364fb43c1cfa28", "scanner": "scanner-primary", "fingerprint": "601bb0d53928e165", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-578c1c716722784e", "level": "warning", "message": {"text": "Frontend route `bills/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "e39f8d40d1f60821", "scanner": "scanner-primary", "fingerprint": "578c1c716722784e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-51b945fd21f115ed", "level": "warning", "message": {"text": "Frontend route `bills/recurring` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "69da52dec648fa88", "scanner": "scanner-primary", "fingerprint": "51b945fd21f115ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1d2a99b27df887fd", "level": "warning", "message": {"text": "Frontend route `bills/recurring/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "f260f1c998f9441f", "scanner": "scanner-primary", "fingerprint": "1d2a99b27df887fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8483ec9320433625", "level": "warning", "message": {"text": "Frontend route `bills/recurring/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "f4f3aede76884502", "scanner": "scanner-primary", "fingerprint": "8483ec9320433625", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6957ecb6f8648ab5", "level": "warning", "message": {"text": "Frontend route `bills/recurring/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "1ee621b29de399fc", "scanner": "scanner-primary", "fingerprint": "6957ecb6f8648ab5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8382b475520c7dac", "level": "warning", "message": {"text": "Frontend route `bills/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "396e4b8165ce3026", "scanner": "scanner-primary", "fingerprint": "8382b475520c7dac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-17b5a972343176cd", "level": "warning", "message": {"text": "Frontend route `bills/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "ed610317646a0e2f", "scanner": "scanner-primary", "fingerprint": "17b5a972343176cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ca536fcbfae4e8b6", "level": "warning", "message": {"text": "Frontend route `banking` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "5c804723429c5953", "scanner": "scanner-primary", "fingerprint": "ca536fcbfae4e8b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-71ddb6066a1a5064", "level": "warning", "message": {"text": "Frontend route `banking/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "6c03792ea2d99fbc", "scanner": "scanner-primary", "fingerprint": "71ddb6066a1a5064", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cd8290e1122ff48d", "level": "warning", "message": {"text": "Frontend route `expenses` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "44d0d3eaf2a731c3", "scanner": "scanner-primary", "fingerprint": "cd8290e1122ff48d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-375a77579ba89fed", "level": "warning", "message": {"text": "Frontend route `expenses/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "993a60154939fed5", "scanner": "scanner-primary", "fingerprint": "375a77579ba89fed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c36355e6de94f676", "level": "warning", "message": {"text": "Frontend route `expenses/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "adec63f9bb5b48ff", "scanner": "scanner-primary", "fingerprint": "c36355e6de94f676", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e5e554f11033cd4b", "level": "warning", "message": {"text": "Frontend route `expenses/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "5e854dfdb29b9bb8", "scanner": "scanner-primary", "fingerprint": "e5e554f11033cd4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-185cb336e2b20968", "level": "warning", "message": {"text": "Frontend route `receivables` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "e8342e7265daafb3", "scanner": "scanner-primary", "fingerprint": "185cb336e2b20968", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b88136de427b382b", "level": "warning", "message": {"text": "Frontend route `payables` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "795d8004b98f5fe6", "scanner": "scanner-primary", "fingerprint": "b88136de427b382b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-62e4ef1bcc09eb36", "level": "warning", "message": {"text": "Frontend route `parties/suppliers` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "c43896d891ad2ac6", "scanner": "scanner-primary", "fingerprint": "62e4ef1bcc09eb36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-605b86a0ea639470", "level": "warning", "message": {"text": "Frontend route `parties/suppliers/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "640278bcc7d3551a", "scanner": "scanner-primary", "fingerprint": "605b86a0ea639470", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9406b81a50a382fb", "level": "warning", "message": {"text": "Frontend route `parties/customers` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "6a9d32a1d56b4d5a", "scanner": "scanner-primary", "fingerprint": "9406b81a50a382fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-155e5034e49d880c", "level": "warning", "message": {"text": "Frontend route `parties/customers/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "34ddfd5e96eacd73", "scanner": "scanner-primary", "fingerprint": "155e5034e49d880c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f955cc50def54754", "level": "warning", "message": {"text": "Frontend route `gst/gstr1` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d4cb681e89b9fc0b", "scanner": "scanner-primary", "fingerprint": "f955cc50def54754", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f006b4b4bd972e75", "level": "warning", "message": {"text": "Frontend route `gst/gstr2b` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "e7f01b541980a1d2", "scanner": "scanner-primary", "fingerprint": "f006b4b4bd972e75", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-109707a0fc218b2b", "level": "warning", "message": {"text": "Frontend route `gst/gstr3b` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "6fbfebc5d2fea45c", "scanner": "scanner-primary", "fingerprint": "109707a0fc218b2b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-245ba3f753cd64a0", "level": "warning", "message": {"text": "Frontend route `gst/grand-summary` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "ecb08f44d23c2ddb", "scanner": "scanner-primary", "fingerprint": "245ba3f753cd64a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5b35a33e5b62bd96", "level": "warning", "message": {"text": "Frontend route `gst/itc-reconciliation` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "442e0647c1bf3805", "scanner": "scanner-primary", "fingerprint": "5b35a33e5b62bd96", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9c80f57ff8770027", "level": "warning", "message": {"text": "Frontend route `gst/filing-health` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "9e53ed42bfd9dd5e", "scanner": "scanner-primary", "fingerprint": "9c80f57ff8770027", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-af8818a2236a2a00", "level": "warning", "message": {"text": "Frontend route `tds` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "41fb90383a17c022", "scanner": "scanner-primary", "fingerprint": "af8818a2236a2a00", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-aca500c66abb564a", "level": "warning", "message": {"text": "Frontend route `reports/trial-balance` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "86b85deb688d67da", "scanner": "scanner-primary", "fingerprint": "aca500c66abb564a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9a324ba475f92d1f", "level": "warning", "message": {"text": "Frontend route `reports/profit-loss` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "68419611b16d7cde", "scanner": "scanner-primary", "fingerprint": "9a324ba475f92d1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ae0a2908aab05241", "level": "warning", "message": {"text": "Frontend route `reports/balance-sheet` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "12d548611080bd83", "scanner": "scanner-primary", "fingerprint": "ae0a2908aab05241", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3ef6dc82628675a5", "level": "warning", "message": {"text": "Frontend route `reports/gst-computation` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d5c403c37f2867f4", "scanner": "scanner-primary", "fingerprint": "3ef6dc82628675a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b70dd7a4efc25d61", "level": "warning", "message": {"text": "Frontend route `reports/hsn-summary` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "01657fe92f7fbed3", "scanner": "scanner-primary", "fingerprint": "b70dd7a4efc25d61", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bbdbedaa2566c1d2", "level": "warning", "message": {"text": "Frontend route `reports/party-outstanding` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "2745bccc98600662", "scanner": "scanner-primary", "fingerprint": "bbdbedaa2566c1d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f8621091841adead", "level": "warning", "message": {"text": "Frontend route `reports/bank-book` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "959e2637c03c646e", "scanner": "scanner-primary", "fingerprint": "f8621091841adead", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bae1cac698d9c365", "level": "warning", "message": {"text": "Frontend route `reports/cash-book` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "7ca9ea819e4aab38", "scanner": "scanner-primary", "fingerprint": "bae1cac698d9c365", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1113eecc0f0d70d3", "level": "warning", "message": {"text": "Frontend route `reports/daybook` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "571c2e461adf4cfe", "scanner": "scanner-primary", "fingerprint": "1113eecc0f0d70d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f36db98adb5870d1", "level": "warning", "message": {"text": "Frontend route `payroll` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "2a349c20b905b7ca", "scanner": "scanner-primary", "fingerprint": "f36db98adb5870d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-36e808141312157f", "level": "warning", "message": {"text": "Frontend route `reports/stock-summary` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "fe1316d9267208e2", "scanner": "scanner-primary", "fingerprint": "36e808141312157f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5e8d33cf404062a4", "level": "warning", "message": {"text": "Frontend route `reports/ledger/:code` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "3a2bae938f80bca1", "scanner": "scanner-primary", "fingerprint": "5e8d33cf404062a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-606dd864a7599a94", "level": "warning", "message": {"text": "Frontend route `sync` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "20464fc480e0cb29", "scanner": "scanner-primary", "fingerprint": "606dd864a7599a94", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ed2bc19f149c2b14", "level": "warning", "message": {"text": "Frontend route `audit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "95c3314d171ddfe5", "scanner": "scanner-primary", "fingerprint": "ed2bc19f149c2b14", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-17bacb17f6efb788", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "7a6f6cf42324831f", "scanner": "scanner-primary", "fingerprint": "17bacb17f6efb788", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c9074eb7ac2ac39e", "level": "warning", "message": {"text": "Frontend route `setup` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "bae2b56c23446254", "scanner": "scanner-primary", "fingerprint": "c9074eb7ac2ac39e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dcda81bd6e115938", "level": "warning", "message": {"text": "Frontend route `cost-centres` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "80b83ce0e98fd683", "scanner": "scanner-primary", "fingerprint": "dcda81bd6e115938", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-66ff2257566de603", "level": "warning", "message": {"text": "Frontend route `voucher-types` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d9b764d71ad35053", "scanner": "scanner-primary", "fingerprint": "66ff2257566de603", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f56abe42663d5af3", "level": "warning", "message": {"text": "Frontend route `activity-map` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "f5d5b044b2027b56", "scanner": "scanner-primary", "fingerprint": "f56abe42663d5af3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6931b7d40b0a7bfb", "level": "warning", "message": {"text": "Frontend route `fixed-assets` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "8b2ce04732b45c77", "scanner": "scanner-primary", "fingerprint": "6931b7d40b0a7bfb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-30be9addd59fe292", "level": "warning", "message": {"text": "Frontend route `loans` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "db6c74564a9c57e5", "scanner": "scanner-primary", "fingerprint": "30be9addd59fe292", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-803e0fb1b3195a8c", "level": "warning", "message": {"text": "Frontend route `banking/cheques` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "63310382df60d7f0", "scanner": "scanner-primary", "fingerprint": "803e0fb1b3195a8c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cdcdcb913cfd2fb4", "level": "warning", "message": {"text": "Frontend route `banking/petty-cash` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "ebc9ae7f33b43868", "scanner": "scanner-primary", "fingerprint": "cdcdcb913cfd2fb4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3b57366db47bd395", "level": "warning", "message": {"text": "Frontend route `notifications` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d356897297b72b16", "scanner": "scanner-primary", "fingerprint": "3b57366db47bd395", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-380b9072cc787dcd", "level": "warning", "message": {"text": "Frontend route `journals/closing-entries` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "c6b7d21bdcdf7e0d", "scanner": "scanner-primary", "fingerprint": "380b9072cc787dcd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6e975cfa8e69d2ed", "level": "error", "message": {"text": "DRF view `BudgetViewSet` declares no `permission_classes` \u2014 backend/budgets/views.py:13"}, "properties": {"repobilityId": "b73592fbb97d9248", "scanner": "scanner-primary", "fingerprint": "6e975cfa8e69d2ed", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/budgets/views.py"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-b2ab7855f571d536", "level": "error", "message": {"text": "DRF view `BudgetVarianceView` declares no `permission_classes` \u2014 backend/budgets/views.py:41"}, "properties": {"repobilityId": "c0de12494f90693d", "scanner": "scanner-primary", "fingerprint": "b2ab7855f571d536", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/budgets/views.py"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-ef1ee8910ba8c8df", "level": "error", "message": {"text": "DRF view `NotificationViewSet` declares no `permission_classes` \u2014 backend/notifications/views.py:11"}, "properties": {"repobilityId": "c10317adbee80200", "scanner": "scanner-primary", "fingerprint": "ef1ee8910ba8c8df", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/notifications/views.py"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-8a3fcf96c6747f56", "level": "error", "message": {"text": "DRF view `NotificationPreferenceViewSet` declares no `permission_classes` \u2014 backend/notifications/views.py:86"}, "properties": {"repobilityId": "7b2854912aea593c", "scanner": "scanner-primary", "fingerprint": "8a3fcf96c6747f56", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/notifications/views.py"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-c44504a80a2b9d14", "level": "error", "message": {"text": "DRF view `SyncRunView` declares no `permission_classes` \u2014 backend/sync/views.py:22"}, "properties": {"repobilityId": "9a0e963e7d4cfdce", "scanner": "scanner-primary", "fingerprint": "c44504a80a2b9d14", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/sync/views.py"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-7881611fb4ed126e", "level": "error", "message": {"text": "DRF view `SyncLogListView` declares no `permission_classes` \u2014 backend/sync/views.py:30"}, "properties": {"repobilityId": "396f8565b7a9bd15", "scanner": "scanner-primary", "fingerprint": "7881611fb4ed126e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/sync/views.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-1eb97a49e15d1cca", "level": "error", "message": {"text": "DRF view `SyncRetryView` declares no `permission_classes` \u2014 backend/sync/views.py:41"}, "properties": {"repobilityId": "6ca75d2dcd82b66f", "scanner": "scanner-primary", "fingerprint": "1eb97a49e15d1cca", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/sync/views.py"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-973346c3042be04d", "level": "error", "message": {"text": "DRF view `SyncErrorListView` declares no `permission_classes` \u2014 backend/sync/views.py:49"}, "properties": {"repobilityId": "f011bad35b097ee4", "scanner": "scanner-primary", "fingerprint": "973346c3042be04d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/sync/views.py"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-590992ee32add2bc", "level": "error", "message": {"text": "DRF view `GSTGrandSummaryView` declares no `permission_classes` \u2014 backend/gst_returns/grand_summary.py:171"}, "properties": {"repobilityId": "ed2e8b68b090ff30", "scanner": "scanner-primary", "fingerprint": "590992ee32add2bc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/grand_summary.py"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-21af39a65592169c", "level": "error", "message": {"text": "DRF view `GSTR1EntryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:43"}, "properties": {"repobilityId": "0cc4637a6ef64a9b", "scanner": "scanner-primary", "fingerprint": "21af39a65592169c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-430740e2d371f74a", "level": "error", "message": {"text": "DRF view `GSTR1HSNSummaryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:321"}, "properties": {"repobilityId": "6ef5289d10ca5333", "scanner": "scanner-primary", "fingerprint": "430740e2d371f74a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 321}}}]}, {"ruleId": "scanner-4b22e3efaa679d78", "level": "error", "message": {"text": "DRF view `GSTR3BSummaryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:338"}, "properties": {"repobilityId": "9e416fca927fd843", "scanner": "scanner-primary", "fingerprint": "4b22e3efaa679d78", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 338}}}]}, {"ruleId": "scanner-c5e2f5ec9325aed5", "level": "error", "message": {"text": "DRF view `GSTR9View` declares no `permission_classes` \u2014 backend/gst_returns/views.py:387"}, "properties": {"repobilityId": "8ba1ddc49946898e", "scanner": "scanner-primary", "fingerprint": "c5e2f5ec9325aed5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 387}}}]}, {"ruleId": "scanner-981b3f443971ce4c", "level": "error", "message": {"text": "DRF view `EWayBillViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:408"}, "properties": {"repobilityId": "3ec2d88a918516bc", "scanner": "scanner-primary", "fingerprint": "981b3f443971ce4c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 408}}}]}, {"ruleId": "scanner-b3a741519506f642", "level": "error", "message": {"text": "DRF view `GSTR9CView` declares no `permission_classes` \u2014 backend/gst_returns/views.py:441"}, "properties": {"repobilityId": "cbe3466bc793e6f5", "scanner": "scanner-primary", "fingerprint": "b3a741519506f642", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 441}}}]}, {"ruleId": "scanner-1b2532f0f3821c60", "level": "error", "message": {"text": "DRF view `GSTLateFeeView` declares no `permission_classes` \u2014 backend/gst_returns/views.py:474"}, "properties": {"repobilityId": "0a8cb1688aef8f71", "scanner": "scanner-primary", "fingerprint": "1b2532f0f3821c60", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 474}}}]}, {"ruleId": "scanner-e6d7b21ee0eb046e", "level": "error", "message": {"text": "DRF view `GSTSetoffPreviewView` declares no `permission_classes` \u2014 backend/gst_returns/views.py:491"}, "properties": {"repobilityId": "9af6280e2e35fef9", "scanner": "scanner-primary", "fingerprint": "e6d7b21ee0eb046e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 491}}}]}, {"ruleId": "scanner-be65415cb076e1a9", "level": "error", "message": {"text": "DRF view `GSTR2BEntryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:522"}, "properties": {"repobilityId": "5868660edcc80ff7", "scanner": "scanner-primary", "fingerprint": "be65415cb076e1a9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 522}}}]}, {"ruleId": "scanner-3b6b9ce93d58c4d6", "level": "error", "message": {"text": "DRF view `ITCReconciliationViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:705"}, "properties": {"repobilityId": "64849a9b2d0697f3", "scanner": "scanner-primary", "fingerprint": "3b6b9ce93d58c4d6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 705}}}]}, {"ruleId": "scanner-831f1608d9eb66ef", "level": "error", "message": {"text": "DRF view `RCMEntryViewSet` declares no `permission_classes` \u2014 backend/gst_returns/views.py:773"}, "properties": {"repobilityId": "a4a743d2e21c6402", "scanner": "scanner-primary", "fingerprint": "831f1608d9eb66ef", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/gst_returns/views.py"}, "region": {"startLine": 773}}}]}, {"ruleId": "scanner-4e0a94598b03f594", "level": "error", "message": {"text": "DRF view `JournalEntryViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:74"}, "properties": {"repobilityId": "23389ef2c2a68ac0", "scanner": "scanner-primary", "fingerprint": "4e0a94598b03f594", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/journals/views.py"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-ac267d8620994b2e", "level": "error", "message": {"text": "DRF view `RecurringJournalViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:445"}, "properties": {"repobilityId": "e7b5cee5e36848a9", "scanner": "scanner-primary", "fingerprint": "ac267d8620994b2e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/journals/views.py"}, "region": {"startLine": 445}}}]}, {"ruleId": "scanner-21942d2366baa41f", "level": "error", "message": {"text": "DRF view `BillReferenceViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:559"}, "properties": {"repobilityId": "dbf3019cc3b6eb61", "scanner": "scanner-primary", "fingerprint": "21942d2366baa41f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/journals/views.py"}, "region": {"startLine": 559}}}]}, {"ruleId": "scanner-b9b541da3f750d71", "level": "error", "message": {"text": "DRF view `VoucherTypeProfileViewSet` declares no `permission_classes` \u2014 backend/journals/views.py:623"}, "properties": {"repobilityId": "7cee7086d31959c6", "scanner": "scanner-primary", "fingerprint": "b9b541da3f750d71", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/journals/views.py"}, "region": {"startLine": 623}}}]}, {"ruleId": "scanner-900f3391d8b0e3b6", "level": "error", "message": {"text": "DRF view `AuditLogListView` declares no `permission_classes` \u2014 backend/audit/views.py:42"}, "properties": {"repobilityId": "5d900913f2f29ab8", "scanner": "scanner-primary", "fingerprint": "900f3391d8b0e3b6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/audit/views.py"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-784d2e08339bb227", "level": "error", "message": {"text": "DRF view `AuditLogCSVExportView` declares no `permission_classes` \u2014 backend/audit/views.py:57"}, "properties": {"repobilityId": "86ffd1d205a3345f", "scanner": "scanner-primary", "fingerprint": "784d2e08339bb227", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/audit/views.py"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-7f1f6eda74c3eb2a", "level": "error", "message": {"text": "DRF view `AuditChainVerifyView` declares no `permission_classes` \u2014 backend/audit/views.py:84"}, "properties": {"repobilityId": "4a1a4a1bbfc812d3", "scanner": "scanner-primary", "fingerprint": "7f1f6eda74c3eb2a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/audit/views.py"}, "region": {"startLine": 84}}}]}, {"ruleId": "scanner-d872cbdc3b790027", "level": "error", "message": {"text": "DRF view `BillViewSet` declares no `permission_classes` \u2014 backend/bills/views.py:33"}, "properties": {"repobilityId": "701ff6e25e4a954b", "scanner": "scanner-primary", "fingerprint": "d872cbdc3b790027", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/bills/views.py"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-c4654db4158e95d3", "level": "error", "message": {"text": "DRF view `BillAttachmentDetailViewSet` declares no `permission_classes` \u2014 backend/bills/views.py:341"}, "properties": {"repobilityId": "d01cf9cf70cad9f5", "scanner": "scanner-primary", "fingerprint": "c4654db4158e95d3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/bills/views.py"}, "region": {"startLine": 341}}}]}, {"ruleId": "scanner-cd7535c39afbc71b", "level": "error", "message": {"text": "DRF view `RecurringBillViewSet` declares no `permission_classes` \u2014 backend/bills/views.py:358"}, "properties": {"repobilityId": "8edf2248fb27347c", "scanner": "scanner-primary", "fingerprint": "cd7535c39afbc71b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/bills/views.py"}, "region": {"startLine": 358}}}]}, {"ruleId": "scanner-ac8357a4cc5059df", "level": "error", "message": {"text": "DRF view `BillPaymentDetailView` declares no `permission_classes` \u2014 backend/bills/views.py:451"}, "properties": {"repobilityId": "f152420ebf34eb97", "scanner": "scanner-primary", "fingerprint": "ac8357a4cc5059df", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/bills/views.py"}, "region": {"startLine": 451}}}]}, {"ruleId": "scanner-1c940046f99d3982", "level": "error", "message": {"text": "DRF view `EmployeeViewSet` declares no `permission_classes` \u2014 backend/payroll/views.py:19"}, "properties": {"repobilityId": "fa3124621d3e9cd8", "scanner": "scanner-primary", "fingerprint": "1c940046f99d3982", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/payroll/views.py"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-9bcf90710b5b7bc2", "level": "error", "message": {"text": "DRF view `SalaryStructureViewSet` declares no `permission_classes` \u2014 backend/payroll/views.py:41"}, "properties": {"repobilityId": "a23f207694134751", "scanner": "scanner-primary", "fingerprint": "9bcf90710b5b7bc2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/payroll/views.py"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-726796ee5b5b6375", "level": "error", "message": {"text": "DRF view `PayrollRunViewSet` declares no `permission_classes` \u2014 backend/payroll/views.py:64"}, "properties": {"repobilityId": "3f5b6fcbab06c55e", "scanner": "scanner-primary", "fingerprint": "726796ee5b5b6375", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/payroll/views.py"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-a5d760551d7ef851", "level": "error", "message": {"text": "DRF view `BankAccountViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:21"}, "properties": {"repobilityId": "b19c34ff2433eed0", "scanner": "scanner-primary", "fingerprint": "a5d760551d7ef851", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/banking/views.py"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-e4b539f51ce8afb1", "level": "error", "message": {"text": "DRF view `BankTransactionViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:89"}, "properties": {"repobilityId": "3784f28babc228cd", "scanner": "scanner-primary", "fingerprint": "e4b539f51ce8afb1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/banking/views.py"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-1fde433eadc8615f", "level": "error", "message": {"text": "DRF view `ChequeViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:237"}, "properties": {"repobilityId": "07c75b318c4a75c6", "scanner": "scanner-primary", "fingerprint": "1fde433eadc8615f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/banking/views.py"}, "region": {"startLine": 237}}}]}, {"ruleId": "scanner-36546ef58358d654", "level": "error", "message": {"text": "DRF view `PettyCashFloatViewSet` declares no `permission_classes` \u2014 backend/banking/views.py:298"}, "properties": {"repobilityId": "1a6ee4c03a6cf6a6", "scanner": "scanner-primary", "fingerprint": "36546ef58358d654", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/banking/views.py"}, "region": {"startLine": 298}}}]}, {"ruleId": "scanner-f50841b02051946b", "level": "error", "message": {"text": "DRF view `AssetClassViewSet` declares no `permission_classes` \u2014 backend/fixed_assets/views.py:25"}, "properties": {"repobilityId": "53cf398a6dbd9890", "scanner": "scanner-primary", "fingerprint": "f50841b02051946b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/fixed_assets/views.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-c371242e2d7c55bd", "level": "error", "message": {"text": "DRF view `FixedAssetViewSet` declares no `permission_classes` \u2014 backend/fixed_assets/views.py:33"}, "properties": {"repobilityId": "c21991e086e75b87", "scanner": "scanner-primary", "fingerprint": "c371242e2d7c55bd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/fixed_assets/views.py"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-d04e9570676e1a94", "level": "error", "message": {"text": "DRF view `DepreciationRunView` declares no `permission_classes` \u2014 backend/fixed_assets/views.py:97"}, "properties": {"repobilityId": "1be50bc5dfec6bdb", "scanner": "scanner-primary", "fingerprint": "d04e9570676e1a94", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/fixed_assets/views.py"}, "region": {"startLine": 97}}}]}, {"ruleId": "scanner-cd3e25299290437b", "level": "error", "message": {"text": "DRF view `ExpenseViewSet` declares no `permission_classes` \u2014 backend/expenses/views.py:28"}, "properties": {"repobilityId": "43410678d7371766", "scanner": "scanner-primary", "fingerprint": "cd3e25299290437b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/expenses/views.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-d5b2201d53d6ab79", "level": "error", "message": {"text": "DRF view `ExpenseAttachmentViewSet` declares no `permission_classes` \u2014 backend/expenses/views.py:145"}, "properties": {"repobilityId": "549a373cb11ed23e", "scanner": "scanner-primary", "fingerprint": "d5b2201d53d6ab79", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/expenses/views.py"}, "region": {"startLine": 145}}}]}, {"ruleId": "scanner-ef3ed40b4db531e4", "level": "error", "message": {"text": "DRF view `SuppliersListView` declares no `permission_classes` \u2014 backend/parties/views.py:71"}, "properties": {"repobilityId": "5278b21cf37e53c4", "scanner": "scanner-primary", "fingerprint": "ef3ed40b4db531e4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-ea467e85bffb17c7", "level": "error", "message": {"text": "DRF view `CustomersListView` declares no `permission_classes` \u2014 backend/parties/views.py:82"}, "properties": {"repobilityId": "40950d70768ffbcf", "scanner": "scanner-primary", "fingerprint": "ea467e85bffb17c7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-6065fff7f6025aa8", "level": "error", "message": {"text": "DRF view `SupplierDetailView` declares no `permission_classes` \u2014 backend/parties/views.py:95"}, "properties": {"repobilityId": "4d776f137e24de52", "scanner": "scanner-primary", "fingerprint": "6065fff7f6025aa8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-adddbce1cf5bdc14", "level": "error", "message": {"text": "DRF view `CustomerDetailView` declares no `permission_classes` \u2014 backend/parties/views.py:106"}, "properties": {"repobilityId": "ac224ab00c403b08", "scanner": "scanner-primary", "fingerprint": "adddbce1cf5bdc14", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-e71e81a92c4c0cfd", "level": "error", "message": {"text": "DRF view `_PartyTransactionsView` declares no `permission_classes` \u2014 backend/parties/views.py:119"}, "properties": {"repobilityId": "d02dfde2db456c37", "scanner": "scanner-primary", "fingerprint": "e71e81a92c4c0cfd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-03a7df9144b59c3d", "level": "error", "message": {"text": "DRF view `_PartyStatementView` declares no `permission_classes` \u2014 backend/parties/views.py:143"}, "properties": {"repobilityId": "5d604c723e2cb19b", "scanner": "scanner-primary", "fingerprint": "03a7df9144b59c3d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-a903ff8274e7a54d", "level": "error", "message": {"text": "DRF view `_PartyStatementCSVView` declares no `permission_classes` \u2014 backend/parties/views.py:165"}, "properties": {"repobilityId": "1f667ca8c96d12ad", "scanner": "scanner-primary", "fingerprint": "a903ff8274e7a54d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 165}}}]}, {"ruleId": "scanner-45329c8984842465", "level": "warning", "message": {"text": "Django CBV `SupplierStatementCSVView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:203"}, "properties": {"repobilityId": "8e4a15ad4952bbf7", "scanner": "scanner-primary", "fingerprint": "45329c8984842465", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-fdd10e7f7f458737", "level": "warning", "message": {"text": "Django CBV `CustomerStatementCSVView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:208"}, "properties": {"repobilityId": "db2cf6770ae132bc", "scanner": "scanner-primary", "fingerprint": "fdd10e7f7f458737", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 208}}}]}, {"ruleId": "scanner-4bef3e8c1ebd0ae7", "level": "error", "message": {"text": "DRF view `_PartyCommunicationsView` declares no `permission_classes` \u2014 backend/parties/views.py:215"}, "properties": {"repobilityId": "ec4817580f4a2d10", "scanner": "scanner-primary", "fingerprint": "4bef3e8c1ebd0ae7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 215}}}]}, {"ruleId": "scanner-379d2b1830b3576f", "level": "warning", "message": {"text": "Django CBV `SupplierCommunicationsView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:242"}, "properties": {"repobilityId": "a6c12248edc6bd54", "scanner": "scanner-primary", "fingerprint": "379d2b1830b3576f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 242}}}]}, {"ruleId": "scanner-7235a19758cbc27d", "level": "warning", "message": {"text": "Django CBV `CustomerCommunicationsView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:247"}, "properties": {"repobilityId": "292d1956c34fe12e", "scanner": "scanner-primary", "fingerprint": "7235a19758cbc27d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-cd660dbad00211de", "level": "error", "message": {"text": "DRF view `_PartyOpeningBalanceView` declares no `permission_classes` \u2014 backend/parties/views.py:254"}, "properties": {"repobilityId": "aa130311ec4da5d7", "scanner": "scanner-primary", "fingerprint": "cd660dbad00211de", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 254}}}]}, {"ruleId": "scanner-46971745b1ae4e23", "level": "warning", "message": {"text": "Django CBV `SupplierOpeningBalanceView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:319"}, "properties": {"repobilityId": "daf321735da1b74d", "scanner": "scanner-primary", "fingerprint": "46971745b1ae4e23", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 319}}}]}, {"ruleId": "scanner-e88dcd7cb967d370", "level": "warning", "message": {"text": "Django CBV `CustomerOpeningBalanceView` lacks `LoginRequiredMixin` \u2014 backend/parties/views.py:324"}, "properties": {"repobilityId": "ff28e2898ea48fba", "scanner": "scanner-primary", "fingerprint": "e88dcd7cb967d370", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 324}}}]}, {"ruleId": "scanner-2d9a024c31cd5a1e", "level": "error", "message": {"text": "DRF view `CommunicationDetailView` declares no `permission_classes` \u2014 backend/parties/views.py:329"}, "properties": {"repobilityId": "70e647829837c9f5", "scanner": "scanner-primary", "fingerprint": "2d9a024c31cd5a1e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/parties/views.py"}, "region": {"startLine": 329}}}]}, {"ruleId": "scanner-b7ade3b25b7d1b25", "level": "error", "message": {"text": "DRF view `ChartOfAccountViewSet` declares no `permission_classes` \u2014 backend/core/views.py:48"}, "properties": {"repobilityId": "0b103888c3998e55", "scanner": "scanner-primary", "fingerprint": "b7ade3b25b7d1b25", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/views.py"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-d8190a63ed27fd9c", "level": "error", "message": {"text": "DRF view `UserLocationsView` declares no `permission_classes` \u2014 backend/core/views.py:371"}, "properties": {"repobilityId": "205f36957ef80a75", "scanner": "scanner-primary", "fingerprint": "d8190a63ed27fd9c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/views.py"}, "region": {"startLine": 371}}}]}, {"ruleId": "scanner-fa2b454b59002182", "level": "error", "message": {"text": "DRF view `SuppliersListView` declares no `permission_classes` \u2014 backend/core/views.py:413"}, "properties": {"repobilityId": "0995652ff52aaf80", "scanner": "scanner-primary", "fingerprint": "fa2b454b59002182", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/views.py"}, "region": {"startLine": 413}}}]}, {"ruleId": "scanner-d24bca70acbc67f0", "level": "error", "message": {"text": "DRF view `CustomersListView` declares no `permission_classes` \u2014 backend/core/views.py:420"}, "properties": {"repobilityId": "879af4ee0b6aeb98", "scanner": "scanner-primary", "fingerprint": "d24bca70acbc67f0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/views.py"}, "region": {"startLine": 420}}}]}, {"ruleId": "scanner-1a9e744b9f424170", "level": "error", "message": {"text": "DRF view `DashboardView` declares no `permission_classes` \u2014 backend/core/views.py:427"}, "properties": {"repobilityId": "00aaf9ef6e51d6c9", "scanner": "scanner-primary", "fingerprint": "1a9e744b9f424170", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/views.py"}, "region": {"startLine": 427}}}]}, {"ruleId": "scanner-3afd823aea55d14e", "level": "error", "message": {"text": "DRF view `CostCategoryViewSet` declares no `permission_classes` \u2014 backend/core/views.py:648"}, "properties": {"repobilityId": "941866e0bc341fd4", "scanner": "scanner-primary", "fingerprint": "3afd823aea55d14e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/views.py"}, "region": {"startLine": 648}}}]}, {"ruleId": "scanner-fbda52ccbaf15a43", "level": "error", "message": {"text": "DRF view `CostCentreViewSet` declares no `permission_classes` \u2014 backend/core/views.py:672"}, "properties": {"repobilityId": "d33b19114428a7df", "scanner": "scanner-primary", "fingerprint": "fbda52ccbaf15a43", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/views.py"}, "region": {"startLine": 672}}}]}, {"ruleId": "scanner-59592fc185ae680f", "level": "warning", "message": {"text": "Django view `resolve_ledger_account` may be unauthenticated \u2014 backend/reports/views.py:15"}, "properties": {"repobilityId": "7de3f113a372aaa5", "scanner": "scanner-primary", "fingerprint": "59592fc185ae680f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "owasp", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-d772d0442c51d167", "level": "error", "message": {"text": "DRF view `TrialBalanceView` declares no `permission_classes` \u2014 backend/reports/views.py:44"}, "properties": {"repobilityId": "1ceb733a6a3ea3e3", "scanner": "scanner-primary", "fingerprint": "d772d0442c51d167", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-e098f0d719f783c4", "level": "error", "message": {"text": "DRF view `ProfitLossView` declares no `permission_classes` \u2014 backend/reports/views.py:105"}, "properties": {"repobilityId": "421fa4c350cd70ff", "scanner": "scanner-primary", "fingerprint": "e098f0d719f783c4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-707c57e37dc40e50", "level": "error", "message": {"text": "DRF view `BalanceSheetView` declares no `permission_classes` \u2014 backend/reports/views.py:236"}, "properties": {"repobilityId": "7d581369ea90870a", "scanner": "scanner-primary", "fingerprint": "707c57e37dc40e50", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 236}}}]}, {"ruleId": "scanner-69e7f84931c5b326", "level": "error", "message": {"text": "DRF view `LedgerView` declares no `permission_classes` \u2014 backend/reports/views.py:355"}, "properties": {"repobilityId": "b74c0338e92d6239", "scanner": "scanner-primary", "fingerprint": "69e7f84931c5b326", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 355}}}]}, {"ruleId": "scanner-74323571fb235518", "level": "error", "message": {"text": "DRF view `LedgerExportView` declares no `permission_classes` \u2014 backend/reports/views.py:447"}, "properties": {"repobilityId": "f3ce76535f5bf30b", "scanner": "scanner-primary", "fingerprint": "74323571fb235518", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 447}}}]}, {"ruleId": "scanner-26176a669d21d808", "level": "error", "message": {"text": "DRF view `ReceivablesAgingView` declares no `permission_classes` \u2014 backend/reports/views.py:655"}, "properties": {"repobilityId": "7e0ee0758d5887dd", "scanner": "scanner-primary", "fingerprint": "26176a669d21d808", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 655}}}]}, {"ruleId": "scanner-c4c29cbf9f95b830", "level": "error", "message": {"text": "DRF view `OpenCustomerInvoicesView` declares no `permission_classes` \u2014 backend/reports/views.py:822"}, "properties": {"repobilityId": "0506a49172f7d582", "scanner": "scanner-primary", "fingerprint": "c4c29cbf9f95b830", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 822}}}]}, {"ruleId": "scanner-b091b86becc6b2d6", "level": "error", "message": {"text": "DRF view `OpenSupplierInvoicesView` declares no `permission_classes` \u2014 backend/reports/views.py:829"}, "properties": {"repobilityId": "ebf6e0721baf80a3", "scanner": "scanner-primary", "fingerprint": "b091b86becc6b2d6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 829}}}]}, {"ruleId": "scanner-0905dd10838e7ca8", "level": "error", "message": {"text": "DRF view `PayablesAgingView` declares no `permission_classes` \u2014 backend/reports/views.py:837"}, "properties": {"repobilityId": "245b2a2ada7be41f", "scanner": "scanner-primary", "fingerprint": "0905dd10838e7ca8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 837}}}]}, {"ruleId": "scanner-41dc40b3a6e2c04f", "level": "error", "message": {"text": "DRF view `BankBookView` declares no `permission_classes` \u2014 backend/reports/views.py:970"}, "properties": {"repobilityId": "cb79734181ab5fd4", "scanner": "scanner-primary", "fingerprint": "41dc40b3a6e2c04f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 970}}}]}, {"ruleId": "scanner-3cd28ec0dd35ddf6", "level": "error", "message": {"text": "DRF view `CashBookView` declares no `permission_classes` \u2014 backend/reports/views.py:975"}, "properties": {"repobilityId": "a7b5236db3d056d4", "scanner": "scanner-primary", "fingerprint": "3cd28ec0dd35ddf6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 975}}}]}, {"ruleId": "scanner-676211ca9ae7fb4d", "level": "error", "message": {"text": "DRF view `DaybookView` declares no `permission_classes` \u2014 backend/reports/views.py:980"}, "properties": {"repobilityId": "d908b91ed60ee76a", "scanner": "scanner-primary", "fingerprint": "676211ca9ae7fb4d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 980}}}]}, {"ruleId": "scanner-74471dd9494cd432", "level": "error", "message": {"text": "DRF view `GSTComputationView` declares no `permission_classes` \u2014 backend/reports/views.py:1044"}, "properties": {"repobilityId": "656741bd8f4391d8", "scanner": "scanner-primary", "fingerprint": "74471dd9494cd432", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1044}}}]}, {"ruleId": "scanner-f3d3bdccdf3933b5", "level": "error", "message": {"text": "DRF view `HSNSummaryView` declares no `permission_classes` \u2014 backend/reports/views.py:1175"}, "properties": {"repobilityId": "74231d2d0ea10db7", "scanner": "scanner-primary", "fingerprint": "f3d3bdccdf3933b5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1175}}}]}, {"ruleId": "scanner-4faebe15d3b5bc0f", "level": "error", "message": {"text": "DRF view `PartyOutstandingView` declares no `permission_classes` \u2014 backend/reports/views.py:1253"}, "properties": {"repobilityId": "b7d96e0ee2eb0cab", "scanner": "scanner-primary", "fingerprint": "4faebe15d3b5bc0f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1253}}}]}, {"ruleId": "scanner-122072e932f2dd0e", "level": "error", "message": {"text": "DRF view `StockMovementSummaryView` declares no `permission_classes` \u2014 backend/reports/views.py:1331"}, "properties": {"repobilityId": "d7c1ba28920f6452", "scanner": "scanner-primary", "fingerprint": "122072e932f2dd0e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1331}}}]}, {"ruleId": "scanner-4924142e553738b0", "level": "error", "message": {"text": "DRF view `StockValuationView` declares no `permission_classes` \u2014 backend/reports/views.py:1456"}, "properties": {"repobilityId": "7958f26fec5b89d2", "scanner": "scanner-primary", "fingerprint": "4924142e553738b0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1456}}}]}, {"ruleId": "scanner-ea81f7695a84db27", "level": "error", "message": {"text": "DRF view `MSMEComplianceReportView` declares no `permission_classes` \u2014 backend/reports/views.py:1509"}, "properties": {"repobilityId": "3eeaa96cb2bc662b", "scanner": "scanner-primary", "fingerprint": "ea81f7695a84db27", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1509}}}]}, {"ruleId": "scanner-3f357575da867c7a", "level": "error", "message": {"text": "DRF view `FinancialRatiosView` declares no `permission_classes` \u2014 backend/reports/views.py:1610"}, "properties": {"repobilityId": "1d64cd29069a69a0", "scanner": "scanner-primary", "fingerprint": "3f357575da867c7a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1610}}}]}, {"ruleId": "scanner-da500cc16416dc8d", "level": "error", "message": {"text": "DRF view `BankReconciliationSummaryView` declares no `permission_classes` \u2014 backend/reports/views.py:1734"}, "properties": {"repobilityId": "0fd10c1ef147658d", "scanner": "scanner-primary", "fingerprint": "da500cc16416dc8d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1734}}}]}, {"ruleId": "scanner-74b73f110f6fecc8", "level": "error", "message": {"text": "DRF view `ClosingStockReconciliationView` declares no `permission_classes` \u2014 backend/reports/views.py:1815"}, "properties": {"repobilityId": "da6e402abe074f63", "scanner": "scanner-primary", "fingerprint": "74b73f110f6fecc8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1815}}}]}, {"ruleId": "scanner-55db74870c268cc2", "level": "error", "message": {"text": "DRF view `AgedStockReportView` declares no `permission_classes` \u2014 backend/reports/views.py:1893"}, "properties": {"repobilityId": "c96382ad4ca23c62", "scanner": "scanner-primary", "fingerprint": "55db74870c268cc2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1893}}}]}, {"ruleId": "scanner-d45bab04568d1093", "level": "error", "message": {"text": "DRF view `DepartmentalPLView` declares no `permission_classes` \u2014 backend/reports/views.py:1952"}, "properties": {"repobilityId": "60da73eeb7e4d86d", "scanner": "scanner-primary", "fingerprint": "d45bab04568d1093", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 1952}}}]}, {"ruleId": "scanner-ebfdc8a4725c3064", "level": "error", "message": {"text": "DRF view `CashFlowStatementView` declares no `permission_classes` \u2014 backend/reports/views.py:2021"}, "properties": {"repobilityId": "a3b72faa3ab18e0e", "scanner": "scanner-primary", "fingerprint": "ebfdc8a4725c3064", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 2021}}}]}, {"ruleId": "scanner-dae7cbd5b238465c", "level": "error", "message": {"text": "DRF view `GSTFilingHealthView` declares no `permission_classes` \u2014 backend/reports/views.py:2178"}, "properties": {"repobilityId": "ffddb6d2fb2bb0f5", "scanner": "scanner-primary", "fingerprint": "dae7cbd5b238465c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reports/views.py"}, "region": {"startLine": 2178}}}]}, {"ruleId": "scanner-269fa9ef24fa21f3", "level": "error", "message": {"text": "DRF view `LoanViewSet` declares no `permission_classes` \u2014 backend/loans/views.py:16"}, "properties": {"repobilityId": "c8dbd2b92d0fad23", "scanner": "scanner-primary", "fingerprint": "269fa9ef24fa21f3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/loans/views.py"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-672b723f69d37c07", "level": "error", "message": {"text": "DRF view `EMIPayView` declares no `permission_classes` \u2014 backend/loans/views.py:85"}, "properties": {"repobilityId": "44923ed3cd981615", "scanner": "scanner-primary", "fingerprint": "672b723f69d37c07", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/loans/views.py"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-c2abf631546fbc03", "level": "error", "message": {"text": "DRF view `TDSRateConfigViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:22"}, "properties": {"repobilityId": "c4eb57ada3c88678", "scanner": "scanner-primary", "fingerprint": "c2abf631546fbc03", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/tds/views.py"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-94a206d438de82e2", "level": "error", "message": {"text": "DRF view `TDSDeductionViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:30"}, "properties": {"repobilityId": "0c2c46f8ac1b98af", "scanner": "scanner-primary", "fingerprint": "94a206d438de82e2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/tds/views.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-13b5ce594bea810b", "level": "error", "message": {"text": "DRF view `TDSChallanViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:225"}, "properties": {"repobilityId": "2c2c227ecbcc8a74", "scanner": "scanner-primary", "fingerprint": "13b5ce594bea810b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/tds/views.py"}, "region": {"startLine": 225}}}]}, {"ruleId": "scanner-7eb3fa328ad15950", "level": "error", "message": {"text": "DRF view `TCSCollectionViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:261"}, "properties": {"repobilityId": "e7334b503c0eaa4a", "scanner": "scanner-primary", "fingerprint": "7eb3fa328ad15950", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/tds/views.py"}, "region": {"startLine": 261}}}]}, {"ruleId": "scanner-b9c2a5172b38ee4b", "level": "error", "message": {"text": "DRF view `Form26ASViewSet` declares no `permission_classes` \u2014 backend/tds/views.py:287"}, "properties": {"repobilityId": "b7421b8ab4175f49", "scanner": "scanner-primary", "fingerprint": "b9c2a5172b38ee4b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/tds/views.py"}, "region": {"startLine": 287}}}]}, {"ruleId": "scanner-a1d9ae90bca0d1bc", "level": "note", "message": {"text": "Unused endpoint: ANY /api/budgets/"}, "properties": {"repobilityId": "8beec3e8af9952db", "scanner": "scanner-primary", "fingerprint": "a1d9ae90bca0d1bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-392099bbc887396e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/budgets/budgets"}, "properties": {"repobilityId": "ebd8000f8a72e44a", "scanner": "scanner-primary", "fingerprint": "392099bbc887396e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-501c26e980a97c01", "level": "note", "message": {"text": "Unused endpoint: ANY /api/budgets/variance"}, "properties": {"repobilityId": "83b66cb5e77c658a", "scanner": "scanner-primary", "fingerprint": "501c26e980a97c01", "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": "4581063f4307db71", "scanner": "scanner-primary", "fingerprint": "e9a17834978cef33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f427b2101ff6083e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/notifications/preferences"}, "properties": {"repobilityId": "a67507479967cae0", "scanner": "scanner-primary", "fingerprint": "f427b2101ff6083e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd101b6b18116f4a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/sync/run/"}, "properties": {"repobilityId": "11906d6cd54b3982", "scanner": "scanner-primary", "fingerprint": "bd101b6b18116f4a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c9820c744382c01e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/sync/logs/"}, "properties": {"repobilityId": "ba315d0bd91f6fb8", "scanner": "scanner-primary", "fingerprint": "c9820c744382c01e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-372fc7dd79818a21", "level": "note", "message": {"text": "Unused endpoint: ANY /api/sync/retry/"}, "properties": {"repobilityId": "a2f1320be7bcfacd", "scanner": "scanner-primary", "fingerprint": "372fc7dd79818a21", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4900db837f64f5d7", "level": "note", "message": {"text": "Unused endpoint: ANY /api/sync/errors/"}, "properties": {"repobilityId": "a4c1bbd7b5b47f58", "scanner": "scanner-primary", "fingerprint": "4900db837f64f5d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b17f0822dc94bb0", "level": "note", "message": {"text": "Unused endpoint: ANY /api/sync/errors/<int:pk>/resolve/"}, "properties": {"repobilityId": "1bf01c23687d2755", "scanner": "scanner-primary", "fingerprint": "5b17f0822dc94bb0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7c0db36f99f9286", "level": "note", "message": {"text": "Unused endpoint: ANY /api/sync/full-resync/"}, "properties": {"repobilityId": "b05bc29db142b75f", "scanner": "scanner-primary", "fingerprint": "a7c0db36f99f9286", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-20b58943b2bd68f7", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/grand-summary/"}, "properties": {"repobilityId": "e51a339434ec2f2d", "scanner": "scanner-primary", "fingerprint": "20b58943b2bd68f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d8a40a9c21600bbc", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/gstr1"}, "properties": {"repobilityId": "5b0040bf3a98100a", "scanner": "scanner-primary", "fingerprint": "d8a40a9c21600bbc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b83d18ff46bde103", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/gstr1-hsn"}, "properties": {"repobilityId": "77d5be72e4fed9a0", "scanner": "scanner-primary", "fingerprint": "b83d18ff46bde103", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cfe428fd11b07198", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/gstr3b"}, "properties": {"repobilityId": "01780b3ff64862f0", "scanner": "scanner-primary", "fingerprint": "cfe428fd11b07198", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f83cf442f883bb16", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/gstr2b"}, "properties": {"repobilityId": "f7989df37ab1bdd1", "scanner": "scanner-primary", "fingerprint": "f83cf442f883bb16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-76ed2d3c303d90ef", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/itc-reconciliation"}, "properties": {"repobilityId": "a14c8b21b742e361", "scanner": "scanner-primary", "fingerprint": "76ed2d3c303d90ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2906e8971c8dda8", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/rcm"}, "properties": {"repobilityId": "5ea4895170c3f3b3", "scanner": "scanner-primary", "fingerprint": "e2906e8971c8dda8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-88493b5ccc2139cc", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/setoff-preview"}, "properties": {"repobilityId": "92bd907de1d21cdd", "scanner": "scanner-primary", "fingerprint": "88493b5ccc2139cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f446cbdf394af66e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/gstr9"}, "properties": {"repobilityId": "2b72aa864ffeeb46", "scanner": "scanner-primary", "fingerprint": "f446cbdf394af66e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-176a68d3e612e0bd", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/gstr9c"}, "properties": {"repobilityId": "a602ec1ec35e0e92", "scanner": "scanner-primary", "fingerprint": "176a68d3e612e0bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bdd5d25e0a3143dc", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/late-fee"}, "properties": {"repobilityId": "fba662255f70d8a4", "scanner": "scanner-primary", "fingerprint": "bdd5d25e0a3143dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d995ae03bcb1efd", "level": "note", "message": {"text": "Unused endpoint: ANY /api/gst/eway-bills"}, "properties": {"repobilityId": "f51cedbb8e1f8422", "scanner": "scanner-primary", "fingerprint": "0d995ae03bcb1efd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-09ecf823fba61917", "level": "note", "message": {"text": "Unused endpoint: ANY /api/journals/entries"}, "properties": {"repobilityId": "dee8aa8f4e3193e7", "scanner": "scanner-primary", "fingerprint": "09ecf823fba61917", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-356bdc6f791e8c84", "level": "note", "message": {"text": "Unused endpoint: ANY /api/journals/recurring"}, "properties": {"repobilityId": "a2b31a2ef504801e", "scanner": "scanner-primary", "fingerprint": "356bdc6f791e8c84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f721f61ea6e304d6", "level": "note", "message": {"text": "Unused endpoint: ANY /api/journals/bill-references"}, "properties": {"repobilityId": "9bb286cce8963255", "scanner": "scanner-primary", "fingerprint": "f721f61ea6e304d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd05edd8581d3eb2", "level": "note", "message": {"text": "Unused endpoint: ANY /api/journals/voucher-types"}, "properties": {"repobilityId": "e670e2e68d1d4201", "scanner": "scanner-primary", "fingerprint": "dd05edd8581d3eb2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-55d7b445a7638743", "level": "note", "message": {"text": "Unused endpoint: ANY /api/audit/"}, "properties": {"repobilityId": "df1cbbeb26b8cf3d", "scanner": "scanner-primary", "fingerprint": "55d7b445a7638743", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cbaf09d262293121", "level": "note", "message": {"text": "Unused endpoint: ANY /api/audit/export-csv/"}, "properties": {"repobilityId": "0b6ca02a56dd1f14", "scanner": "scanner-primary", "fingerprint": "cbaf09d262293121", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-555dc727c02bf080", "level": "note", "message": {"text": "Unused endpoint: ANY /api/audit/verify-chain/"}, "properties": {"repobilityId": "13c274569d4c1fd1", "scanner": "scanner-primary", "fingerprint": "555dc727c02bf080", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e96c708b2b777d83", "level": "note", "message": {"text": "Unused endpoint: ANY /api/bills/"}, "properties": {"repobilityId": "db246c4bd8708fe0", "scanner": "scanner-primary", "fingerprint": "e96c708b2b777d83", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f56e1205f5f324f", "level": "note", "message": {"text": "Unused endpoint: ANY /api/bills/bills"}, "properties": {"repobilityId": "c8c4c3629dd14b31", "scanner": "scanner-primary", "fingerprint": "1f56e1205f5f324f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d02d76656c28499", "level": "note", "message": {"text": "Unused endpoint: ANY /api/bills/recurring"}, "properties": {"repobilityId": "f6f05b635a5dd7b0", "scanner": "scanner-primary", "fingerprint": "9d02d76656c28499", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f9a31f400ad9955a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/bills/payments"}, "properties": {"repobilityId": "e61bb4582113b4fe", "scanner": "scanner-primary", "fingerprint": "f9a31f400ad9955a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0eed1c474ee43c40", "level": "note", "message": {"text": "Unused endpoint: ANY /api/bills/attachments"}, "properties": {"repobilityId": "c1b8123d252ea5c9", "scanner": "scanner-primary", "fingerprint": "0eed1c474ee43c40", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7860c5b39149eae0", "level": "note", "message": {"text": "Unused endpoint: ANY /api/payroll/"}, "properties": {"repobilityId": "28a727c591dd8052", "scanner": "scanner-primary", "fingerprint": "7860c5b39149eae0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5d046d5357ebdcf6", "level": "note", "message": {"text": "Unused endpoint: ANY /api/payroll/employees"}, "properties": {"repobilityId": "fcf5f0c6a9df4df7", "scanner": "scanner-primary", "fingerprint": "5d046d5357ebdcf6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad3a9b4534d35cb0", "level": "note", "message": {"text": "Unused endpoint: ANY /api/payroll/salary-structures"}, "properties": {"repobilityId": "233a17b9b9d5c0a3", "scanner": "scanner-primary", "fingerprint": "ad3a9b4534d35cb0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-763db9597a0c447e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/payroll/runs"}, "properties": {"repobilityId": "ddb1fa3044474e71", "scanner": "scanner-primary", "fingerprint": "763db9597a0c447e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be343aba7254b063", "level": "note", "message": {"text": "Unused endpoint: ANY /api/banking/"}, "properties": {"repobilityId": "b7609fc5673d5da3", "scanner": "scanner-primary", "fingerprint": "be343aba7254b063", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d57c5a210a4a6006", "level": "note", "message": {"text": "Unused endpoint: ANY /api/banking/accounts"}, "properties": {"repobilityId": "dc10c5113d6655d7", "scanner": "scanner-primary", "fingerprint": "d57c5a210a4a6006", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75717d2190affcd9", "level": "note", "message": {"text": "Unused endpoint: ANY /api/banking/transactions"}, "properties": {"repobilityId": "fbca650fdb745151", "scanner": "scanner-primary", "fingerprint": "75717d2190affcd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f88b9eeb9512c4c4", "level": "note", "message": {"text": "Unused endpoint: ANY /api/banking/cheques"}, "properties": {"repobilityId": "0ccc7e41556cdd46", "scanner": "scanner-primary", "fingerprint": "f88b9eeb9512c4c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f110992bb736703", "level": "note", "message": {"text": "Unused endpoint: ANY /api/banking/petty-cash"}, "properties": {"repobilityId": "c2c12cc2b1d5583d", "scanner": "scanner-primary", "fingerprint": "1f110992bb736703", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec6a16d49277a278", "level": "note", "message": {"text": "Unused endpoint: ANY /api/fixed-assets/"}, "properties": {"repobilityId": "86f35524685650e1", "scanner": "scanner-primary", "fingerprint": "ec6a16d49277a278", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5cee89557fd676e9", "level": "note", "message": {"text": "Unused endpoint: ANY /api/fixed-assets/classes"}, "properties": {"repobilityId": "801c193972a23b4a", "scanner": "scanner-primary", "fingerprint": "5cee89557fd676e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3687437fde6748fd", "level": "note", "message": {"text": "Unused endpoint: ANY /api/fixed-assets/assets"}, "properties": {"repobilityId": "dd803ede787c2ac0", "scanner": "scanner-primary", "fingerprint": "3687437fde6748fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1982b545290c4ab0", "level": "note", "message": {"text": "Unused endpoint: ANY /api/fixed-assets/depreciation"}, "properties": {"repobilityId": "53a5e25245a60e24", "scanner": "scanner-primary", "fingerprint": "1982b545290c4ab0", "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": "8480729962a95411", "scanner": "scanner-primary", "fingerprint": "11fb3ddb5793f8f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c13695d53a0ccb03", "level": "note", "message": {"text": "Unused endpoint: ANY /api/expenses/expenses"}, "properties": {"repobilityId": "ef001a34d2ae83bc", "scanner": "scanner-primary", "fingerprint": "c13695d53a0ccb03", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}