{"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-24555b200a3ba87c", "name": "Possibly dead Python function: doc_sort_key", "shortDescription": {"text": "Possibly dead Python function: doc_sort_key"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-803c53f6a04af6b2", "name": "Possibly dead Python function: run", "shortDescription": {"text": "Possibly dead Python function: run"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed6e658f1d37db8e", "name": "Possibly dead Python function: backfill_trade_types", "shortDescription": {"text": "Possibly dead Python function: backfill_trade_types"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f16ab7b1dfa0092", "name": "Possibly dead Python function: backfill_mtt_import_facts", "shortDescription": {"text": "Possibly dead Python function: backfill_mtt_import_facts"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-830236c88fa98825", "name": "Possibly dead Python function: relink_purchase_orders", "shortDescription": {"text": "Possibly dead Python function: relink_purchase_orders"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e7256fd2015bcfc9", "name": "Possibly dead Python function: import_addresses", "shortDescription": {"text": "Possibly dead Python function: import_addresses"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-74830f8c4ae62cac", "name": "Possibly dead Python function: merge_customers", "shortDescription": {"text": "Possibly dead Python function: merge_customers"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8991cd8b70fc1c0", "name": "Possibly dead Python function: fix_ports", "shortDescription": {"text": "Possibly dead Python function: fix_ports"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-447cee9492f8fe6e", "name": "Possibly dead Python function: fix_chas", "shortDescription": {"text": "Possibly dead Python function: fix_chas"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ccf981e0069df73", "name": "Possibly dead Python function: clear_company_data", "shortDescription": {"text": "Possibly dead Python function: clear_company_data"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-44cccbcc2160eff5", "name": "Possibly dead Python function: run", "shortDescription": {"text": "Possibly dead Python function: run"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-98e0484343235c35", "name": "Possibly dead Python function: resolved_for_blocking", "shortDescription": {"text": "Possibly dead Python function: resolved_for_blocking"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-508c00daa5670358", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/Icon.tsx:92", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/Icon.tsx:92"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4fa30b7a5e3d0246", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/Icon.tsx:92", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/Icon.tsx:92"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a5eba88245490153", "name": "Very large file: frontend/src/pages/ShipmentDetail.tsx (1609 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/ShipmentDetail.tsx (1609 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-21a92b8edc5f5d6a", "name": "Very large file: exportflow/api.py (2927 lines)", "shortDescription": {"text": "Very large file: exportflow/api.py (2927 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "8 test file(s) for 116 source file(s) (ratio 0.07). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 67 placeholder/mock markers across 21 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-ce57748003959d1b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/NewShipment.tsx:273", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/NewShipment.tsx:273"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b09ba1f84b0baee7", "name": "Commented-code block (5 lines) in frontend/src/pages/ShipmentDetail.tsx:481", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/ShipmentDetail.tsx:481"}, "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-7dc61ae7e3b574cf", "name": "Commented-code block (6 lines) in exportflow/overrides/purchase_order.py:16", "shortDescription": {"text": "Commented-code block (6 lines) in exportflow/overrides/purchase_order.py:16"}, "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:\nexportflow/api.py:cf, exportflow/api.py:cf\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-a92c48a97e4647cc", "name": "Frontend route `sales` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `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-e492e9d79de02637", "name": "Frontend route `sales-orders` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `sales-orders` 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-4b2da6381fa4da7c", "name": "Frontend route `sales-orders/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `sales-orders/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-012283e425af507e", "name": "Frontend route `sales-orders/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `sales-orders/: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-d55fff9c45c7f718", "name": "Frontend route `sales-orders/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `sales-orders/: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-30233a9491eaf82b", "name": "Frontend route `pfi/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `pfi/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-8e760452574e1088", "name": "Frontend route `pfi/:name` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `pfi/:name` 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-56609ef48da08daa", "name": "Frontend route `lc/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `lc/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-36f4178450a5098e", "name": "Frontend route `lc/:name` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `lc/:name` 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-d97eb85b21176d1c", "name": "Frontend route `purchases` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `purchases` 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-7d54ea23e0bc84dc", "name": "Frontend route `purchases/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `purchases/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-63160d119c5be1ba", "name": "Frontend route `purchases/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `purchases/: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-39247fceea67edf6", "name": "Frontend route `purchases/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `purchases/: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-103bb47ecac8eb8f", "name": "Frontend route `shipments` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `shipments` 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-83ee34d94d15858a", "name": "Frontend route `shipments/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `shipments/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-a0888389c1116f96", "name": "Frontend route `shipments/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `shipments/: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-e80e60163d276e3b", "name": "Frontend route `documents` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `documents` 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-dd4b47cb479393fb", "name": "Frontend route `finance` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `finance` 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-b369f4071b41f08c", "name": "Frontend route `compliance` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `compliance` 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}}]}}, "automationDetails": {"id": "repobility/20548"}, "properties": {"repository": "suranaaditya/export-flow", "repoUrl": "https://github.com/suranaaditya/export-flow", "branch": "main"}, "results": [{"ruleId": "scanner-24555b200a3ba87c", "level": "note", "message": {"text": "Possibly dead Python function: doc_sort_key"}, "properties": {"repobilityId": "d49be0191eac2e1a", "scanner": "scanner-primary", "fingerprint": "24555b200a3ba87c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/api.py:2704"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-803c53f6a04af6b2", "level": "note", "message": {"text": "Possibly dead Python function: run"}, "properties": {"repobilityId": "1dbeb43640a3ab52", "scanner": "scanner-primary", "fingerprint": "803c53f6a04af6b2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/gst_setup.py:247"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ed6e658f1d37db8e", "level": "note", "message": {"text": "Possibly dead Python function: backfill_trade_types"}, "properties": {"repobilityId": "db8a28b6704bcb24", "scanner": "scanner-primary", "fingerprint": "ed6e658f1d37db8e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/mis_import.py:451"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6f16ab7b1dfa0092", "level": "note", "message": {"text": "Possibly dead Python function: backfill_mtt_import_facts"}, "properties": {"repobilityId": "8691b75f4f3da3a0", "scanner": "scanner-primary", "fingerprint": "6f16ab7b1dfa0092", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/mis_import.py:509"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-830236c88fa98825", "level": "note", "message": {"text": "Possibly dead Python function: relink_purchase_orders"}, "properties": {"repobilityId": "b5ee4165a6a4f014", "scanner": "scanner-primary", "fingerprint": "830236c88fa98825", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/mis_import.py:574"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e7256fd2015bcfc9", "level": "note", "message": {"text": "Possibly dead Python function: import_addresses"}, "properties": {"repobilityId": "c38e42f967fab092", "scanner": "scanner-primary", "fingerprint": "e7256fd2015bcfc9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/mis_import.py:682"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-74830f8c4ae62cac", "level": "note", "message": {"text": "Possibly dead Python function: merge_customers"}, "properties": {"repobilityId": "9d31de8da092243c", "scanner": "scanner-primary", "fingerprint": "74830f8c4ae62cac", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/mis_import.py:760"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d8991cd8b70fc1c0", "level": "note", "message": {"text": "Possibly dead Python function: fix_ports"}, "properties": {"repobilityId": "d0a5e0c28da872bf", "scanner": "scanner-primary", "fingerprint": "d8991cd8b70fc1c0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/mis_import.py:856"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-447cee9492f8fe6e", "level": "note", "message": {"text": "Possibly dead Python function: fix_chas"}, "properties": {"repobilityId": "340b1ca47ef98278", "scanner": "scanner-primary", "fingerprint": "447cee9492f8fe6e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/mis_import.py:922"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ccf981e0069df73", "level": "note", "message": {"text": "Possibly dead Python function: clear_company_data"}, "properties": {"repobilityId": "52617cd95bdd4c24", "scanner": "scanner-primary", "fingerprint": "3ccf981e0069df73", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/mis_import.py:962"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44cccbcc2160eff5", "level": "note", "message": {"text": "Possibly dead Python function: run"}, "properties": {"repobilityId": "1dbeb43640a3ab52", "scanner": "scanner-primary", "fingerprint": "44cccbcc2160eff5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/mis_import.py:996"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-98e0484343235c35", "level": "note", "message": {"text": "Possibly dead Python function: resolved_for_blocking"}, "properties": {"repobilityId": "75407609551dc575", "scanner": "scanner-primary", "fingerprint": "98e0484343235c35", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exportflow/exportflow/doctype/document_instance/document_instance.py:54"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-508c00daa5670358", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/Icon.tsx:92"}, "properties": {"repobilityId": "576dc24ee4f917f7", "scanner": "scanner-primary", "fingerprint": "508c00daa5670358", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4fa30b7a5e3d0246", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/Icon.tsx:92"}, "properties": {"repobilityId": "af0bb050a2c11685", "scanner": "scanner-primary", "fingerprint": "4fa30b7a5e3d0246", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/Icon.tsx"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-a5eba88245490153", "level": "note", "message": {"text": "Very large file: frontend/src/pages/ShipmentDetail.tsx (1609 lines)"}, "properties": {"repobilityId": "efc6a6131cc6c13e", "scanner": "scanner-primary", "fingerprint": "a5eba88245490153", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-21a92b8edc5f5d6a", "level": "note", "message": {"text": "Very large file: exportflow/api.py (2927 lines)"}, "properties": {"repobilityId": "8b60905315e1b95a", "scanner": "scanner-primary", "fingerprint": "21a92b8edc5f5d6a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "2a4841cea2bf1ae5", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "38b0f5030f94a5d0", "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": "2c63f2ec986b5b47", "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": "ce0a49cce1650a41", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "15b744a0d1b9c4ab", "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": "1fb08c1a56e518a1", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-ce57748003959d1b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/NewShipment.tsx:273"}, "properties": {"repobilityId": "e933e115b1a8d252", "scanner": "scanner-primary", "fingerprint": "ce57748003959d1b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b09ba1f84b0baee7", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/ShipmentDetail.tsx:481"}, "properties": {"repobilityId": "15b640ffcb18b3ce", "scanner": "scanner-primary", "fingerprint": "b09ba1f84b0baee7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7dc61ae7e3b574cf", "level": "none", "message": {"text": "Commented-code block (6 lines) in exportflow/overrides/purchase_order.py:16"}, "properties": {"repobilityId": "07c8a63bdc8abe07", "scanner": "scanner-primary", "fingerprint": "7dc61ae7e3b574cf", "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": "b9aa6b1ff76ed938", "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": "d616906ef0033f5b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-a92c48a97e4647cc", "level": "warning", "message": {"text": "Frontend route `sales` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "4e05cc2980021089", "scanner": "scanner-primary", "fingerprint": "a92c48a97e4647cc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e492e9d79de02637", "level": "warning", "message": {"text": "Frontend route `sales-orders` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "b9faba0bcdb4f01c", "scanner": "scanner-primary", "fingerprint": "e492e9d79de02637", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4b2da6381fa4da7c", "level": "warning", "message": {"text": "Frontend route `sales-orders/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "4324c1cf4977043a", "scanner": "scanner-primary", "fingerprint": "4b2da6381fa4da7c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-012283e425af507e", "level": "warning", "message": {"text": "Frontend route `sales-orders/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "0b5111b91c7d7092", "scanner": "scanner-primary", "fingerprint": "012283e425af507e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d55fff9c45c7f718", "level": "warning", "message": {"text": "Frontend route `sales-orders/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "2d6afa7d3bea7448", "scanner": "scanner-primary", "fingerprint": "d55fff9c45c7f718", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-30233a9491eaf82b", "level": "warning", "message": {"text": "Frontend route `pfi/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "2e6ebee6f94888b5", "scanner": "scanner-primary", "fingerprint": "30233a9491eaf82b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8e760452574e1088", "level": "warning", "message": {"text": "Frontend route `pfi/:name` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "f1db9f981bf378c7", "scanner": "scanner-primary", "fingerprint": "8e760452574e1088", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-56609ef48da08daa", "level": "warning", "message": {"text": "Frontend route `lc/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "8c164765823f95e6", "scanner": "scanner-primary", "fingerprint": "56609ef48da08daa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-36f4178450a5098e", "level": "warning", "message": {"text": "Frontend route `lc/:name` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "de07ea4af726ccff", "scanner": "scanner-primary", "fingerprint": "36f4178450a5098e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d97eb85b21176d1c", "level": "warning", "message": {"text": "Frontend route `purchases` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "c1c3e386f6fb385a", "scanner": "scanner-primary", "fingerprint": "d97eb85b21176d1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7d54ea23e0bc84dc", "level": "warning", "message": {"text": "Frontend route `purchases/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "40dab4b6efdbd778", "scanner": "scanner-primary", "fingerprint": "7d54ea23e0bc84dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-63160d119c5be1ba", "level": "warning", "message": {"text": "Frontend route `purchases/:id/edit` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "e5eaa651d0278d74", "scanner": "scanner-primary", "fingerprint": "63160d119c5be1ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-39247fceea67edf6", "level": "warning", "message": {"text": "Frontend route `purchases/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "ffb7367ccf4c8524", "scanner": "scanner-primary", "fingerprint": "39247fceea67edf6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-103bb47ecac8eb8f", "level": "warning", "message": {"text": "Frontend route `shipments` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "53b386365e34267e", "scanner": "scanner-primary", "fingerprint": "103bb47ecac8eb8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-83ee34d94d15858a", "level": "warning", "message": {"text": "Frontend route `shipments/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d4efce3f38d7553d", "scanner": "scanner-primary", "fingerprint": "83ee34d94d15858a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a0888389c1116f96", "level": "warning", "message": {"text": "Frontend route `shipments/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "a519c865cdf29460", "scanner": "scanner-primary", "fingerprint": "a0888389c1116f96", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e80e60163d276e3b", "level": "warning", "message": {"text": "Frontend route `documents` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "adc05bb236f8cc1e", "scanner": "scanner-primary", "fingerprint": "e80e60163d276e3b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dd4b47cb479393fb", "level": "warning", "message": {"text": "Frontend route `finance` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "db33462186066db7", "scanner": "scanner-primary", "fingerprint": "dd4b47cb479393fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b369f4071b41f08c", "level": "warning", "message": {"text": "Frontend route `compliance` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "f3b1e4fd195fb90d", "scanner": "scanner-primary", "fingerprint": "b369f4071b41f08c", "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"]}}]}]}