{"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-dfa0dff3ad37d499", "name": "Possibly dead Python function: start_weekday_for_history", "shortDescription": {"text": "Possibly dead Python function: start_weekday_for_history"}, "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-0cbad92ded933e0e", "name": "Possibly dead Python function: recent_daily_revenue", "shortDescription": {"text": "Possibly dead Python function: recent_daily_revenue"}, "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-a0622f6bd9716905", "name": "Possibly dead Python function: supplier_observations", "shortDescription": {"text": "Possibly dead Python function: supplier_observations"}, "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-329b45130fdc855c", "name": "Possibly dead Python function: require_admin", "shortDescription": {"text": "Possibly dead Python function: require_admin"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e81673bb0fc047b3", "name": "Possibly dead Python function: require_active_access", "shortDescription": {"text": "Possibly dead Python function: require_active_access"}, "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-7b9ce49833a74a70", "name": "Possibly dead Python function: dependency", "shortDescription": {"text": "Possibly dead Python function: dependency"}, "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-8bf579024dbe869c", "name": "Possibly dead Python function: daily_history", "shortDescription": {"text": "Possibly dead Python function: daily_history"}, "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-0bd880a8ee5a4115", "name": "Possibly dead Python function: daily_history", "shortDescription": {"text": "Possibly dead Python function: daily_history"}, "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-738df89a42373e95", "name": "Possibly dead Python function: recent_revenue", "shortDescription": {"text": "Possibly dead Python function: recent_revenue"}, "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-70d7df71671929b7", "name": "Possibly dead Python function: recent_deliveries", "shortDescription": {"text": "Possibly dead Python function: recent_deliveries"}, "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-b968719d5281afad", "name": "Possibly dead Python function: run_alert_evaluation_once", "shortDescription": {"text": "Possibly dead Python function: run_alert_evaluation_once"}, "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-043c8af4b91f5a97", "name": "Possibly dead Python function: send_waitlist_confirmation", "shortDescription": {"text": "Possibly dead Python function: send_waitlist_confirmation"}, "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-ee719491daf10478", "name": "Possibly dead Python function: send_contact_notification", "shortDescription": {"text": "Possibly dead Python function: send_contact_notification"}, "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-dc1e0a618617827c", "name": "Possibly dead Python function: send_magic_link_email", "shortDescription": {"text": "Possibly dead Python function: send_magic_link_email"}, "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-3cdfc39121de67c0", "name": "Possibly dead Python function: consume_magic_link_token", "shortDescription": {"text": "Possibly dead Python function: consume_magic_link_token"}, "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-f8b71aa39cb1440a", "name": "Possibly dead Python function: build_inventory_action_feed", "shortDescription": {"text": "Possibly dead Python function: build_inventory_action_feed"}, "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-8864c20f8bfe11e3", "name": "Possibly dead Python function: list_persisted_skus", "shortDescription": {"text": "Possibly dead Python function: list_persisted_skus"}, "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-c125b4647619da40", "name": "Possibly dead Python function: build_action_data_health_summary", "shortDescription": {"text": "Possibly dead Python function: build_action_data_health_summary"}, "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-9c8c0f0e15409af3", "name": "Possibly dead Python function: analyze_bundles", "shortDescription": {"text": "Possibly dead Python function: analyze_bundles"}, "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-011b896480a3b9dc", "name": "Possibly dead Python function: history", "shortDescription": {"text": "Possibly dead Python function: history"}, "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-c9689ec301b698d4", "name": "Possibly dead Python function: create_checkout_session", "shortDescription": {"text": "Possibly dead Python function: create_checkout_session"}, "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-8fa78db9180f1114", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/layout.tsx:93", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/layout.tsx:93"}, "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-037c7018b7c27c7c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/stocky-alternatives-2026/page.tsx:95", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/stocky-alternatives-2026/page.tsx:95"}, "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-a9a4dba6e0a55647", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/shopify-safety-stock-formula/page.tsx:179", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/shopify-safety-stock-formula/page.tsx:179"}, "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-0b58fec29a657d1e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/why-six-month-moving-average-overstocks-you/page", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/why-six-month-moving-average-overstocks-you/page.tsx:83"}, "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-bd9ae56ff4aec970", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/inventory-planner-alternative/page.tsx:155", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/inventory-planner-alternative/page.tsx:155"}, "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-a86339ce59bc202c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/how-to-clear-dead-stock-shopify/page.tsx:173", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/how-to-clear-dead-stock-shopify/page.tsx:173"}, "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-2e722c9661ebe6ac", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/pricing/page.tsx:117", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/pricing/page.tsx:117"}, "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-324278690b48367a", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/app/layout.tsx:93", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/layout.tsx:93"}, "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-6dc50c3f483739c2", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/stocky-alternatives-2026/page.tsx:95", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/stocky-alternatives-2026/page.tsx:95"}, "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-3cce0961ed1cac37", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/shopify-safety-stock-formula/page.tsx:179", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/shopify-safety-stock-formula/page.tsx:179"}, "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-aaab145676c7be54", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/why-six-month-moving-average-overstocks-you/page.tsx:83", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/why-six-month-moving-average-overstocks-you/page.tsx:83"}, "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-2d4750188adfde5d", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/inventory-planner-alternative/page.tsx:155", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/inventory-planner-alternative/page.tsx:155"}, "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-498cc1b2bd1aa4f2", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/how-to-clear-dead-stock-shopify/page.tsx:173", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/how-to-clear-dead-stock-shopify/page.tsx:173"}, "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-97a049c42e6e5d37", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/app/pricing/page.tsx:117", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/pricing/page.tsx:117"}, "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-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-10ddcbdbe07b5d90", "name": "Very large file: frontend/app/(app-shell)/reports/page.tsx (1963 lines)", "shortDescription": {"text": "Very large file: frontend/app/(app-shell)/reports/page.tsx (1963 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-cb4a3c5704c0d6d6", "name": "Very large file: frontend/app/(app-shell)/purchase-orders/page.tsx (1720 lines)", "shortDescription": {"text": "Very large file: frontend/app/(app-shell)/purchase-orders/page.tsx (1720 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-0e11c086ae8c2461", "name": "Very large file: frontend/lib/demo-data.ts (1846 lines)", "shortDescription": {"text": "Very large file: frontend/lib/demo-data.ts (1846 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": "0 test file(s) for 180 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 5 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 56 placeholder/mock markers across 24 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, tests. 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": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests. 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-283bec2469682153", "name": "Commented-code block (5 lines) in frontend/lib/report-export.ts:594", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/lib/report-export.ts:594"}, "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-50f4df66909c1655", "name": "Commented-code block (5 lines) in frontend/lib/shopify-embedded.ts:32", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/lib/shopify-embedded.ts:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b7ba25e029e239c", "name": "Commented-code block (6 lines) in frontend/lib/demo-data.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/lib/demo-data.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f29cef2f3550b691", "name": "Commented-code block (5 lines) in backend/app/api/deps.py:160", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/api/deps.py:160"}, "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-2a1bce3d8a3b8291", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/forecast.py:9", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/forecast.py:9"}, "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-797c33a928d16b53", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/reorder.py:10", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/reorder.py:10"}, "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-86fd7c5a8551fb44", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/dashboard.py:12", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/dashboard.py:12"}, "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-1c9506087161359c", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/analytics.py:9", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/analytics.py:9"}, "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-f947a3ff7a6d3dd6", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/transfers.py:9", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/transfers.py:9"}, "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-2cc9acb5b1ee82a4", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/bundles.py:9", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/bundles.py:9"}, "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-7f9272faa666bc63", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/alerts.py:10", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/alerts.py:10"}, "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-689078dc855cb0a0", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/liquidation.py:9", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/liquidation.py:9"}, "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-454008e08dc44ad7", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/audit.py:11", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/audit.py:11"}, "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-9a449d6260c89fa2", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/suppliers.py:9", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/suppliers.py:9"}, "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-4cc248ad63bc0abf", "name": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/report_schedules.py:11", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/report_schedules.py:11"}, "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-d8002234734e5564", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/notifications.py:25", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/notifications.py:25"}, "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-8364bc08162dc9cf", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/forecasting.py:21", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/forecasting.py:21"}, "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-e00a1900ad0889ed", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/reorder_optimizer.py:21", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/reorder_optimizer.py:21"}, "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-79e8174ec59396a7", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/alert_evaluation.py:10", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/alert_evaluation.py:10"}, "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-4e5ff13a6a6ae343", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/weekly_digest.py:19", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/weekly_digest.py:19"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-28bb6a00e40e829d", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/purchase_order_records.py:15", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/purchase_order_records.py:15"}, "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-ea303e7143990dac", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/dashboard.py:17", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/dashboard.py:17"}, "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-2385795195f3fc15", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/dead_stock.py:15", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/dead_stock.py:15"}, "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-a47f72c10b5f0810", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/inventory_health.py:8", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/inventory_health.py:8"}, "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-fd2633f2af7b69f5", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/transfers.py:11", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/transfers.py:11"}, "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-94462eb08f62bee7", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/purchase_orders.py:10", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/purchase_orders.py:10"}, "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-68e5edee81ae31d9", "name": "Legacy-named symbol `model_copy` in backend/app/services/action_feed.py:381", "shortDescription": {"text": "Legacy-named symbol `model_copy` in backend/app/services/action_feed.py:381"}, "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-8c98c0070004fe43", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/supplier_scoring.py:15", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/supplier_scoring.py:15"}, "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-0b74c6bdca7e57de", "name": "Legacy-named symbol `mock_data_v2` in backend/app/services/shop_skus.py:297", "shortDescription": {"text": "Legacy-named symbol `mock_data_v2` in backend/app/services/shop_skus.py:297"}, "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-673126acd25054a6", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/alerts.py:23", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/alerts.py:23"}, "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-d942aac85b78e619", "name": "Commented-code block (5 lines) in backend/app/services/shopify_billing.py:23", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/services/shopify_billing.py:23"}, "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-033449f5022049ee", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/bundle_analyzer.py:18", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/bundle_analyzer.py:18"}, "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-bb3c09035f9b2309", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/abc_analysis.py:21", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/abc_analysis.py:21"}, "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-2bab8c9c1c930016", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/buying_calendar.py:18", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/buying_calendar.py:18"}, "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-4b5da48a405a2cfd", "name": "Legacy-named symbol `schemas_v2` in backend/app/services/bundle_opportunities.py:16", "shortDescription": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/bundle_opportunities.py:16"}, "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-d30f85c43b86dcf0", "name": "27 env vars used in code but missing from .env.example", "shortDescription": {"text": "27 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_BOOTSTRAP_TOKEN`, `ADMIN_EMAILS`, `COOKIE_DOMAIN`, `GENERIC_WEBHOOK_TIMEOUT`, `NEXT_PUBLIC_SITE_URL`, `NODE_ENV`, `OPENAI_API_KEY`, `OPENAI_MODEL` + 19 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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/app/api/routes/shipstation_import.py:import_shipstation, backend/app/api/routes/stocky_import.py:import_stocky_csv\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/app/api/routes/shopify_privacy_webhooks.py:customers_data_request, backend/app/api/routes/shopify_privacy_webhooks.py:customers_redact, backend/app/api/routes/shopify_privacy_webhooks.py:shop_redact, backend/app/api/routes/shopify_privacy_webhooks.py:app_uninstalled\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/app/services/shop_settings.py:upsert_vendor_lead_times, backend/app/services/shop_settings.py:upsert_category_lead_times, backend/app/services/shop_settings.py:upsert_sku_lead_times\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-336fd3f7f152d846", "name": "FastAPI POST `customers_data_request` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:82", "shortDescription": {"text": "FastAPI POST `customers_data_request` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:82"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-421f5fe2b73e1dba", "name": "FastAPI POST `customers_redact` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:105", "shortDescription": {"text": "FastAPI POST `customers_redact` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:105"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a4d8c36a333b1acf", "name": "FastAPI POST `shop_redact` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:127", "shortDescription": {"text": "FastAPI POST `shop_redact` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:127"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-33142e58d4e8099d", "name": "FastAPI POST `app_uninstalled` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:154", "shortDescription": {"text": "FastAPI POST `app_uninstalled` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:154"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-66d0e133437a0f6b", "name": "FastAPI POST `submit` without auth dependency \u2014 backend/app/api/routes/contact.py:31", "shortDescription": {"text": "FastAPI POST `submit` without auth dependency \u2014 backend/app/api/routes/contact.py:31"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-be4cb5e3cabcce80", "name": "Unused endpoint: POST /import", "shortDescription": {"text": "Unused endpoint: POST /import"}, "fullDescription": {"text": "`backend/app/api/routes/shipstation_import.py` declares `POST /import` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8d16b1bb2723f51e", "name": "Unused endpoint: POST /signup", "shortDescription": {"text": "Unused endpoint: POST /signup"}, "fullDescription": {"text": "`backend/app/api/routes/waitlist.py` declares `POST /signup` 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-5d6e2a62d2d0d400", "name": "Unused endpoint: GET /count", "shortDescription": {"text": "Unused endpoint: GET /count"}, "fullDescription": {"text": "`backend/app/api/routes/waitlist.py` declares `GET /count` 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-80452db3fde88b33", "name": "Unused endpoint: POST /customers/data_request", "shortDescription": {"text": "Unused endpoint: POST /customers/data_request"}, "fullDescription": {"text": "`backend/app/api/routes/shopify_privacy_webhooks.py` declares `POST /customers/data_request` 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-74dadb1612c03753", "name": "Unused endpoint: POST /customers/redact", "shortDescription": {"text": "Unused endpoint: POST /customers/redact"}, "fullDescription": {"text": "`backend/app/api/routes/shopify_privacy_webhooks.py` declares `POST /customers/redact` 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-b457f0f0112d7278", "name": "Unused endpoint: POST /shop/redact", "shortDescription": {"text": "Unused endpoint: POST /shop/redact"}, "fullDescription": {"text": "`backend/app/api/routes/shopify_privacy_webhooks.py` declares `POST /shop/redact` 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-9628d0e72d28fca4", "name": "Unused endpoint: POST /app/uninstalled", "shortDescription": {"text": "Unused endpoint: POST /app/uninstalled"}, "fullDescription": {"text": "`backend/app/api/routes/shopify_privacy_webhooks.py` declares `POST /app/uninstalled` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/app/api/routes/forecast.py` declares `GET /` 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-2719debabc49d25c", "name": "Unused endpoint: GET /{sku_id}", "shortDescription": {"text": "Unused endpoint: GET /{sku_id}"}, "fullDescription": {"text": "`backend/app/api/routes/forecast.py` declares `GET /{sku_id}` 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-178ecbc535b52d35", "name": "Unused endpoint: GET /buying-calendar", "shortDescription": {"text": "Unused endpoint: GET /buying-calendar"}, "fullDescription": {"text": "`backend/app/api/routes/reorder.py` declares `GET /buying-calendar` 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-37b389c3d4577b1f", "name": "Unused endpoint: GET /cash-plan", "shortDescription": {"text": "Unused endpoint: GET /cash-plan"}, "fullDescription": {"text": "`backend/app/api/routes/reorder.py` declares `GET /cash-plan` 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-decdc4e27e83d653", "name": "Unused endpoint: GET /purchase-orders", "shortDescription": {"text": "Unused endpoint: GET /purchase-orders"}, "fullDescription": {"text": "`backend/app/api/routes/reorder.py` declares `GET /purchase-orders` 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-2459316cb8c91180", "name": "Unused endpoint: POST /purchase-orders", "shortDescription": {"text": "Unused endpoint: POST /purchase-orders"}, "fullDescription": {"text": "`backend/app/api/routes/reorder.py` declares `POST /purchase-orders` 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-f776ad247557b36b", "name": "Unused endpoint: POST /purchase-orders/{po_id}/status", "shortDescription": {"text": "Unused endpoint: POST /purchase-orders/{po_id}/status"}, "fullDescription": {"text": "`backend/app/api/routes/reorder.py` declares `POST /purchase-orders/{po_id}/status` 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-dee462608372b5fa", "name": "Unused endpoint: POST /purchase-orders/{po_id}/receive", "shortDescription": {"text": "Unused endpoint: POST /purchase-orders/{po_id}/receive"}, "fullDescription": {"text": "`backend/app/api/routes/reorder.py` declares `POST /purchase-orders/{po_id}/receive` 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-f338a686474ff259", "name": "Unused endpoint: GET /install", "shortDescription": {"text": "Unused endpoint: GET /install"}, "fullDescription": {"text": "`backend/app/api/routes/shopify_ingestion.py` declares `GET /install` 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-cdfb578618cf2542", "name": "Unused endpoint: GET /callback", "shortDescription": {"text": "Unused endpoint: GET /callback"}, "fullDescription": {"text": "`backend/app/api/routes/shopify_ingestion.py` declares `GET /callback` 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-e188e6cf6a89278f", "name": "Unused endpoint: GET /connection", "shortDescription": {"text": "Unused endpoint: GET /connection"}, "fullDescription": {"text": "`backend/app/api/routes/shopify_ingestion.py` declares `GET /connection` 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-fa413208496243a5", "name": "Unused endpoint: POST /sync", "shortDescription": {"text": "Unused endpoint: POST /sync"}, "fullDescription": {"text": "`backend/app/api/routes/shopify_ingestion.py` declares `POST /sync` 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-e1b7bee247ffc801", "name": "Unused endpoint: GET /summary", "shortDescription": {"text": "Unused endpoint: GET /summary"}, "fullDescription": {"text": "`backend/app/api/routes/skus.py` declares `GET /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-52c40df350200e83", "name": "Unused endpoint: POST /leads", "shortDescription": {"text": "Unused endpoint: POST /leads"}, "fullDescription": {"text": "`backend/app/api/routes/inventory_risk_snapshot.py` declares `POST /leads` 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-6eb19a2be7a6629c", "name": "Unused endpoint: GET /leads", "shortDescription": {"text": "Unused endpoint: GET /leads"}, "fullDescription": {"text": "`backend/app/api/routes/inventory_risk_snapshot.py` declares `GET /leads` 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-aa04acb9d5b0bdf7", "name": "Unused endpoint: GET /leads/export.csv", "shortDescription": {"text": "Unused endpoint: GET /leads/export.csv"}, "fullDescription": {"text": "`backend/app/api/routes/inventory_risk_snapshot.py` declares `GET /leads/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-80530b1e8c346fb1", "name": "Unused endpoint: GET /leads/export.xlsx", "shortDescription": {"text": "Unused endpoint: GET /leads/export.xlsx"}, "fullDescription": {"text": "`backend/app/api/routes/inventory_risk_snapshot.py` declares `GET /leads/export.xlsx` 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-f53301a3dc7875d3", "name": "Unused endpoint: POST /magic-link/request", "shortDescription": {"text": "Unused endpoint: POST /magic-link/request"}, "fullDescription": {"text": "`backend/app/api/routes/auth.py` declares `POST /magic-link/request` 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-78c145251a7b78a8", "name": "Unused endpoint: POST /magic-link/verify", "shortDescription": {"text": "Unused endpoint: POST /magic-link/verify"}, "fullDescription": {"text": "`backend/app/api/routes/auth.py` declares `POST /magic-link/verify` 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-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`backend/app/api/routes/auth.py` declares `POST /logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`backend/app/api/routes/auth.py` declares `GET /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ba440796d8deb66", "name": "Unused endpoint: GET /scorecards", "shortDescription": {"text": "Unused endpoint: GET /scorecards"}, "fullDescription": {"text": "`backend/app/api/routes/analytics.py` declares `GET /scorecards` 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-ec97c873980071be", "name": "Unused endpoint: GET /inventory-value", "shortDescription": {"text": "Unused endpoint: GET /inventory-value"}, "fullDescription": {"text": "`backend/app/api/routes/analytics.py` declares `GET /inventory-value` 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-c360006dbbbee4ac", "name": "Unused endpoint: GET /inventory-health", "shortDescription": {"text": "Unused endpoint: GET /inventory-health"}, "fullDescription": {"text": "`backend/app/api/routes/analytics.py` declares `GET /inventory-health` 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-67d28fa8cd6bb12f", "name": "Unused endpoint: PUT /", "shortDescription": {"text": "Unused endpoint: PUT /"}, "fullDescription": {"text": "`backend/app/api/routes/shop_settings.py` declares `PUT /` 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-3fa3953e23b25818", "name": "Unused endpoint: GET /vendor-lead-times", "shortDescription": {"text": "Unused endpoint: GET /vendor-lead-times"}, "fullDescription": {"text": "`backend/app/api/routes/shop_settings.py` declares `GET /vendor-lead-times` 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-3b5ec5fa7c037599", "name": "Unused endpoint: PUT /vendor-lead-times", "shortDescription": {"text": "Unused endpoint: PUT /vendor-lead-times"}, "fullDescription": {"text": "`backend/app/api/routes/shop_settings.py` declares `PUT /vendor-lead-times` 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-8d7d761da86c34c8", "name": "Unused endpoint: GET /category-lead-times", "shortDescription": {"text": "Unused endpoint: GET /category-lead-times"}, "fullDescription": {"text": "`backend/app/api/routes/shop_settings.py` declares `GET /category-lead-times` 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-85f36f6a7457a4c1", "name": "Unused endpoint: PUT /category-lead-times", "shortDescription": {"text": "Unused endpoint: PUT /category-lead-times"}, "fullDescription": {"text": "`backend/app/api/routes/shop_settings.py` declares `PUT /category-lead-times` 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-9c91ed7b97d98b2c", "name": "Unused endpoint: GET /sku-lead-times", "shortDescription": {"text": "Unused endpoint: GET /sku-lead-times"}, "fullDescription": {"text": "`backend/app/api/routes/shop_settings.py` declares `GET /sku-lead-times` 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-a0c7bf9d646da03e", "name": "Unused endpoint: PUT /sku-lead-times", "shortDescription": {"text": "Unused endpoint: PUT /sku-lead-times"}, "fullDescription": {"text": "`backend/app/api/routes/shop_settings.py` declares `PUT /sku-lead-times` 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-2e9b48dd151de62c", "name": "Unused endpoint: GET /dead-stock-pairings", "shortDescription": {"text": "Unused endpoint: GET /dead-stock-pairings"}, "fullDescription": {"text": "`backend/app/api/routes/bundles.py` declares `GET /dead-stock-pairings` 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-46eb93a4accdc83b", "name": "Unused endpoint: POST /invite", "shortDescription": {"text": "Unused endpoint: POST /invite"}, "fullDescription": {"text": "`backend/app/api/routes/admin.py` declares `POST /invite` 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-841e50bf821e4158", "name": "Unused endpoint: GET /users", "shortDescription": {"text": "Unused endpoint: GET /users"}, "fullDescription": {"text": "`backend/app/api/routes/admin.py` declares `GET /users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e42f43fc121948e6", "name": "Unused endpoint: POST /billing/reconcile", "shortDescription": {"text": "Unused endpoint: POST /billing/reconcile"}, "fullDescription": {"text": "`backend/app/api/routes/admin.py` declares `POST /billing/reconcile` 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-cff8da5fbc19c76d", "name": "Unused endpoint: POST /chat", "shortDescription": {"text": "Unused endpoint: POST /chat"}, "fullDescription": {"text": "`backend/app/api/routes/ai_chat.py` declares `POST /chat` 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-26bf5f94d883f709", "name": "Unused endpoint: GET /rules", "shortDescription": {"text": "Unused endpoint: GET /rules"}, "fullDescription": {"text": "`backend/app/api/routes/alerts.py` declares `GET /rules` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d91a7845c35d0f8f", "name": "Unused endpoint: POST /rules", "shortDescription": {"text": "Unused endpoint: POST /rules"}, "fullDescription": {"text": "`backend/app/api/routes/alerts.py` declares `POST /rules` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-778993ec577548b6", "name": "Unused endpoint: DELETE /rules/{rule_id}", "shortDescription": {"text": "Unused endpoint: DELETE /rules/{rule_id}"}, "fullDescription": {"text": "`backend/app/api/routes/alerts.py` declares `DELETE /rules/{rule_id}` 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-7acef55ead004203", "name": "Unused endpoint: PATCH /rules/{rule_id}/toggle", "shortDescription": {"text": "Unused endpoint: PATCH /rules/{rule_id}/toggle"}, "fullDescription": {"text": "`backend/app/api/routes/alerts.py` declares `PATCH /rules/{rule_id}/toggle` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0b9bdc04b58bea3", "name": "Unused endpoint: GET /channels", "shortDescription": {"text": "Unused endpoint: GET /channels"}, "fullDescription": {"text": "`backend/app/api/routes/alerts.py` declares `GET /channels` 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-14a78266393888c7", "name": "Unused endpoint: POST /channels", "shortDescription": {"text": "Unused endpoint: POST /channels"}, "fullDescription": {"text": "`backend/app/api/routes/alerts.py` declares `POST /channels` 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-731c57f59aaca553", "name": "Unused endpoint: POST /test", "shortDescription": {"text": "Unused endpoint: POST /test"}, "fullDescription": {"text": "`backend/app/api/routes/alerts.py` declares `POST /test` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18240"}, "properties": {"repository": "rlsmth20/shopify-analytics-engine-", "repoUrl": "https://github.com/rlsmth20/shopify-analytics-engine-", "branch": "main"}, "results": [{"ruleId": "scanner-dfa0dff3ad37d499", "level": "note", "message": {"text": "Possibly dead Python function: start_weekday_for_history"}, "properties": {"repobilityId": "2278a4f3b31bc0ce", "scanner": "scanner-primary", "fingerprint": "dfa0dff3ad37d499", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/mock_data_v2.py:146"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0cbad92ded933e0e", "level": "note", "message": {"text": "Possibly dead Python function: recent_daily_revenue"}, "properties": {"repobilityId": "c4045cd56f1c865f", "scanner": "scanner-primary", "fingerprint": "0cbad92ded933e0e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/mock_data_v2.py:154"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a0622f6bd9716905", "level": "note", "message": {"text": "Possibly dead Python function: supplier_observations"}, "properties": {"repobilityId": "cc72682792a59117", "scanner": "scanner-primary", "fingerprint": "a0622f6bd9716905", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/mock_data_v2.py:164"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-329b45130fdc855c", "level": "note", "message": {"text": "Possibly dead Python function: require_admin"}, "properties": {"repobilityId": "3c06db2e25566bf7", "scanner": "scanner-primary", "fingerprint": "329b45130fdc855c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/deps.py:117"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e81673bb0fc047b3", "level": "note", "message": {"text": "Possibly dead Python function: require_active_access"}, "properties": {"repobilityId": "d233f8e54ca090ee", "scanner": "scanner-primary", "fingerprint": "e81673bb0fc047b3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/deps.py:129"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7b9ce49833a74a70", "level": "note", "message": {"text": "Possibly dead Python function: dependency"}, "properties": {"repobilityId": "e2f97c76f5b6acb6", "scanner": "scanner-primary", "fingerprint": "7b9ce49833a74a70", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/deps.py:203"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8bf579024dbe869c", "level": "note", "message": {"text": "Possibly dead Python function: daily_history"}, "properties": {"repobilityId": "6d5e6a74ceb4ee92", "scanner": "scanner-primary", "fingerprint": "8bf579024dbe869c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/routes/reorder.py:236"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0bd880a8ee5a4115", "level": "note", "message": {"text": "Possibly dead Python function: daily_history"}, "properties": {"repobilityId": "6d5e6a74ceb4ee92", "scanner": "scanner-primary", "fingerprint": "0bd880a8ee5a4115", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/routes/dashboard.py:39"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-738df89a42373e95", "level": "note", "message": {"text": "Possibly dead Python function: recent_revenue"}, "properties": {"repobilityId": "ede5edb191e2a2a7", "scanner": "scanner-primary", "fingerprint": "738df89a42373e95", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/routes/dashboard.py:43"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-70d7df71671929b7", "level": "note", "message": {"text": "Possibly dead Python function: recent_deliveries"}, "properties": {"repobilityId": "f1c8691a8b004ee5", "scanner": "scanner-primary", "fingerprint": "70d7df71671929b7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/notifications.py:45"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b968719d5281afad", "level": "note", "message": {"text": "Possibly dead Python function: run_alert_evaluation_once"}, "properties": {"repobilityId": "d3fa5fa4cd25130b", "scanner": "scanner-primary", "fingerprint": "b968719d5281afad", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/alert_scheduler.py:39"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-043c8af4b91f5a97", "level": "note", "message": {"text": "Possibly dead Python function: send_waitlist_confirmation"}, "properties": {"repobilityId": "86085928af742aa0", "scanner": "scanner-primary", "fingerprint": "043c8af4b91f5a97", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/transactional_email.py:116"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ee719491daf10478", "level": "note", "message": {"text": "Possibly dead Python function: send_contact_notification"}, "properties": {"repobilityId": "a2740fe737e92bb1", "scanner": "scanner-primary", "fingerprint": "ee719491daf10478", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/transactional_email.py:192"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dc1e0a618617827c", "level": "note", "message": {"text": "Possibly dead Python function: send_magic_link_email"}, "properties": {"repobilityId": "42cf25f1d18d4908", "scanner": "scanner-primary", "fingerprint": "dc1e0a618617827c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/transactional_email.py:286"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3cdfc39121de67c0", "level": "note", "message": {"text": "Possibly dead Python function: consume_magic_link_token"}, "properties": {"repobilityId": "5ecfe3ed7272cd5b", "scanner": "scanner-primary", "fingerprint": "3cdfc39121de67c0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/auth.py:130"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f8b71aa39cb1440a", "level": "note", "message": {"text": "Possibly dead Python function: build_inventory_action_feed"}, "properties": {"repobilityId": "631d70463d632140", "scanner": "scanner-primary", "fingerprint": "f8b71aa39cb1440a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/action_feed.py:76"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8864c20f8bfe11e3", "level": "note", "message": {"text": "Possibly dead Python function: list_persisted_skus"}, "properties": {"repobilityId": "3f683a92baf5ecce", "scanner": "scanner-primary", "fingerprint": "8864c20f8bfe11e3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/action_feed.py:93"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c125b4647619da40", "level": "note", "message": {"text": "Possibly dead Python function: build_action_data_health_summary"}, "properties": {"repobilityId": "76538d4ca7c47a39", "scanner": "scanner-primary", "fingerprint": "c125b4647619da40", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/action_feed.py:148"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9c8c0f0e15409af3", "level": "note", "message": {"text": "Possibly dead Python function: analyze_bundles"}, "properties": {"repobilityId": "343dfe0664116a9b", "scanner": "scanner-primary", "fingerprint": "9c8c0f0e15409af3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/bundle_analyzer.py:28"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-011b896480a3b9dc", "level": "note", "message": {"text": "Possibly dead Python function: history"}, "properties": {"repobilityId": "8222d0a21c7a3ec7", "scanner": "scanner-primary", "fingerprint": "011b896480a3b9dc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/abc_analysis.py:29"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c9689ec301b698d4", "level": "note", "message": {"text": "Possibly dead Python function: create_checkout_session"}, "properties": {"repobilityId": "5ffda94b3770b580", "scanner": "scanner-primary", "fingerprint": "c9689ec301b698d4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/billing.py:262"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8fa78db9180f1114", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/layout.tsx:93"}, "properties": {"repobilityId": "c3711f4722a30929", "scanner": "scanner-primary", "fingerprint": "8fa78db9180f1114", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-037c7018b7c27c7c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/stocky-alternatives-2026/page.tsx:95"}, "properties": {"repobilityId": "65d51b4bc8f5eff6", "scanner": "scanner-primary", "fingerprint": "037c7018b7c27c7c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a9a4dba6e0a55647", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/shopify-safety-stock-formula/page.tsx:179"}, "properties": {"repobilityId": "afe7f02f4416aa4e", "scanner": "scanner-primary", "fingerprint": "a9a4dba6e0a55647", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0b58fec29a657d1e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/why-six-month-moving-average-overstocks-you/page.tsx:83"}, "properties": {"repobilityId": "8e5c74a800e2f59e", "scanner": "scanner-primary", "fingerprint": "0b58fec29a657d1e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bd9ae56ff4aec970", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/inventory-planner-alternative/page.tsx:155"}, "properties": {"repobilityId": "04db3755dbbf088e", "scanner": "scanner-primary", "fingerprint": "bd9ae56ff4aec970", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a86339ce59bc202c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/blog/how-to-clear-dead-stock-shopify/page.tsx:173"}, "properties": {"repobilityId": "7b6eae8ddd257d84", "scanner": "scanner-primary", "fingerprint": "a86339ce59bc202c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2e722c9661ebe6ac", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/pricing/page.tsx:117"}, "properties": {"repobilityId": "cd52501c2be0d0bb", "scanner": "scanner-primary", "fingerprint": "2e722c9661ebe6ac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-324278690b48367a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/layout.tsx:93"}, "properties": {"repobilityId": "352266f153f8b038", "scanner": "scanner-primary", "fingerprint": "324278690b48367a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/layout.tsx"}, "region": {"startLine": 93}}}]}, {"ruleId": "scanner-6dc50c3f483739c2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/stocky-alternatives-2026/page.tsx:95"}, "properties": {"repobilityId": "54bd36d4d340567e", "scanner": "scanner-primary", "fingerprint": "6dc50c3f483739c2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/blog/stocky-alternatives-2026/page.tsx"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-3cce0961ed1cac37", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/shopify-safety-stock-formula/page.tsx:179"}, "properties": {"repobilityId": "47dc741cfa3fff83", "scanner": "scanner-primary", "fingerprint": "3cce0961ed1cac37", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/blog/shopify-safety-stock-formula/page.tsx"}, "region": {"startLine": 179}}}]}, {"ruleId": "scanner-aaab145676c7be54", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/why-six-month-moving-average-overstocks-you/page.tsx:83"}, "properties": {"repobilityId": "2b0b14f5ff1a0076", "scanner": "scanner-primary", "fingerprint": "aaab145676c7be54", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/blog/why-six-month-moving-average-overstocks-you/page.tsx"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-2d4750188adfde5d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/inventory-planner-alternative/page.tsx:155"}, "properties": {"repobilityId": "5d9e49d4293cab11", "scanner": "scanner-primary", "fingerprint": "2d4750188adfde5d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/blog/inventory-planner-alternative/page.tsx"}, "region": {"startLine": 155}}}]}, {"ruleId": "scanner-498cc1b2bd1aa4f2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/blog/how-to-clear-dead-stock-shopify/page.tsx:173"}, "properties": {"repobilityId": "bfdc5e0f19888991", "scanner": "scanner-primary", "fingerprint": "498cc1b2bd1aa4f2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/blog/how-to-clear-dead-stock-shopify/page.tsx"}, "region": {"startLine": 173}}}]}, {"ruleId": "scanner-97a049c42e6e5d37", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/pricing/page.tsx:117"}, "properties": {"repobilityId": "87c34a312217fc42", "scanner": "scanner-primary", "fingerprint": "97a049c42e6e5d37", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/pricing/page.tsx"}, "region": {"startLine": 117}}}]}, {"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-10ddcbdbe07b5d90", "level": "note", "message": {"text": "Very large file: frontend/app/(app-shell)/reports/page.tsx (1963 lines)"}, "properties": {"repobilityId": "e93c5fb516cc6c29", "scanner": "scanner-primary", "fingerprint": "10ddcbdbe07b5d90", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cb4a3c5704c0d6d6", "level": "note", "message": {"text": "Very large file: frontend/app/(app-shell)/purchase-orders/page.tsx (1720 lines)"}, "properties": {"repobilityId": "49925e00613527a5", "scanner": "scanner-primary", "fingerprint": "cb4a3c5704c0d6d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0e11c086ae8c2461", "level": "note", "message": {"text": "Very large file: frontend/lib/demo-data.ts (1846 lines)"}, "properties": {"repobilityId": "638e1d448774775c", "scanner": "scanner-primary", "fingerprint": "0e11c086ae8c2461", "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": "f46a357e921dd9e2", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "403914e6b07d5946", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "997e1fa5c20bca5d", "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": "0c29a6d5ee25f43d", "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": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "20565de5eaaa45b3", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "9062247d764eec46", "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": "2867c8aa53cab96b", "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": "6ea1f2efd96d3078", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-283bec2469682153", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/lib/report-export.ts:594"}, "properties": {"repobilityId": "8c2357b2a7d00abc", "scanner": "scanner-primary", "fingerprint": "283bec2469682153", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-50f4df66909c1655", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/lib/shopify-embedded.ts:32"}, "properties": {"repobilityId": "f3a33489824d2c12", "scanner": "scanner-primary", "fingerprint": "50f4df66909c1655", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b7ba25e029e239c", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/lib/demo-data.ts:1"}, "properties": {"repobilityId": "0be697a5d1c49d71", "scanner": "scanner-primary", "fingerprint": "8b7ba25e029e239c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f29cef2f3550b691", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/api/deps.py:160"}, "properties": {"repobilityId": "2f63d691f330ed43", "scanner": "scanner-primary", "fingerprint": "f29cef2f3550b691", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a1bce3d8a3b8291", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/forecast.py:9"}, "properties": {"repobilityId": "5775f199d6af77c5", "scanner": "scanner-primary", "fingerprint": "2a1bce3d8a3b8291", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-797c33a928d16b53", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/reorder.py:10"}, "properties": {"repobilityId": "e103e9314b2960f4", "scanner": "scanner-primary", "fingerprint": "797c33a928d16b53", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-86fd7c5a8551fb44", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/dashboard.py:12"}, "properties": {"repobilityId": "9d7c516af750c3e8", "scanner": "scanner-primary", "fingerprint": "86fd7c5a8551fb44", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1c9506087161359c", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/analytics.py:9"}, "properties": {"repobilityId": "a39ee7f60e400443", "scanner": "scanner-primary", "fingerprint": "1c9506087161359c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f947a3ff7a6d3dd6", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/transfers.py:9"}, "properties": {"repobilityId": "52dd81320399ccb8", "scanner": "scanner-primary", "fingerprint": "f947a3ff7a6d3dd6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2cc9acb5b1ee82a4", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/bundles.py:9"}, "properties": {"repobilityId": "7382481b007a8026", "scanner": "scanner-primary", "fingerprint": "2cc9acb5b1ee82a4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7f9272faa666bc63", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/alerts.py:10"}, "properties": {"repobilityId": "53e654e7c7986692", "scanner": "scanner-primary", "fingerprint": "7f9272faa666bc63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-689078dc855cb0a0", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/liquidation.py:9"}, "properties": {"repobilityId": "412f64431be09d1a", "scanner": "scanner-primary", "fingerprint": "689078dc855cb0a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-454008e08dc44ad7", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/audit.py:11"}, "properties": {"repobilityId": "2dc4f0c921832531", "scanner": "scanner-primary", "fingerprint": "454008e08dc44ad7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9a449d6260c89fa2", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/suppliers.py:9"}, "properties": {"repobilityId": "31a46fa2bc72a01b", "scanner": "scanner-primary", "fingerprint": "9a449d6260c89fa2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4cc248ad63bc0abf", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/api/routes/report_schedules.py:11"}, "properties": {"repobilityId": "8a83f91ffdbbf725", "scanner": "scanner-primary", "fingerprint": "4cc248ad63bc0abf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d8002234734e5564", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/notifications.py:25"}, "properties": {"repobilityId": "df34ee813ba01f6a", "scanner": "scanner-primary", "fingerprint": "d8002234734e5564", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8364bc08162dc9cf", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/forecasting.py:21"}, "properties": {"repobilityId": "5ffe1b0e6bb2aa39", "scanner": "scanner-primary", "fingerprint": "8364bc08162dc9cf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e00a1900ad0889ed", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/reorder_optimizer.py:21"}, "properties": {"repobilityId": "f53e43f2132d4156", "scanner": "scanner-primary", "fingerprint": "e00a1900ad0889ed", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-79e8174ec59396a7", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/alert_evaluation.py:10"}, "properties": {"repobilityId": "1c7566afa259c763", "scanner": "scanner-primary", "fingerprint": "79e8174ec59396a7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4e5ff13a6a6ae343", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/weekly_digest.py:19"}, "properties": {"repobilityId": "3ac498827b6b8928", "scanner": "scanner-primary", "fingerprint": "4e5ff13a6a6ae343", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-28bb6a00e40e829d", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/purchase_order_records.py:15"}, "properties": {"repobilityId": "62b79adc1bc48ddc", "scanner": "scanner-primary", "fingerprint": "28bb6a00e40e829d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ea303e7143990dac", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/dashboard.py:17"}, "properties": {"repobilityId": "3f98bfd42277f5eb", "scanner": "scanner-primary", "fingerprint": "ea303e7143990dac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2385795195f3fc15", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/dead_stock.py:15"}, "properties": {"repobilityId": "b86f3091c2ca26db", "scanner": "scanner-primary", "fingerprint": "2385795195f3fc15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a47f72c10b5f0810", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/inventory_health.py:8"}, "properties": {"repobilityId": "fad254d50c4c02c5", "scanner": "scanner-primary", "fingerprint": "a47f72c10b5f0810", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fd2633f2af7b69f5", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/transfers.py:11"}, "properties": {"repobilityId": "f02eaae0801bcbc8", "scanner": "scanner-primary", "fingerprint": "fd2633f2af7b69f5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-94462eb08f62bee7", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/purchase_orders.py:10"}, "properties": {"repobilityId": "fb33f6f007f93efb", "scanner": "scanner-primary", "fingerprint": "94462eb08f62bee7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-68e5edee81ae31d9", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in backend/app/services/action_feed.py:381"}, "properties": {"repobilityId": "35c96eaaf5226da3", "scanner": "scanner-primary", "fingerprint": "68e5edee81ae31d9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8c98c0070004fe43", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/supplier_scoring.py:15"}, "properties": {"repobilityId": "663dab8a2fae7925", "scanner": "scanner-primary", "fingerprint": "8c98c0070004fe43", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0b74c6bdca7e57de", "level": "note", "message": {"text": "Legacy-named symbol `mock_data_v2` in backend/app/services/shop_skus.py:297"}, "properties": {"repobilityId": "f75f9f05bf372d99", "scanner": "scanner-primary", "fingerprint": "0b74c6bdca7e57de", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-673126acd25054a6", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/alerts.py:23"}, "properties": {"repobilityId": "43f46c4cae4f1b6d", "scanner": "scanner-primary", "fingerprint": "673126acd25054a6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d942aac85b78e619", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/services/shopify_billing.py:23"}, "properties": {"repobilityId": "2520be1076bdc549", "scanner": "scanner-primary", "fingerprint": "d942aac85b78e619", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-033449f5022049ee", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/bundle_analyzer.py:18"}, "properties": {"repobilityId": "bc5902441352fb6b", "scanner": "scanner-primary", "fingerprint": "033449f5022049ee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bb3c09035f9b2309", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/abc_analysis.py:21"}, "properties": {"repobilityId": "9d67824e6a0512ab", "scanner": "scanner-primary", "fingerprint": "bb3c09035f9b2309", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2bab8c9c1c930016", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/buying_calendar.py:18"}, "properties": {"repobilityId": "5af0aa32b91a6e20", "scanner": "scanner-primary", "fingerprint": "2bab8c9c1c930016", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4b5da48a405a2cfd", "level": "note", "message": {"text": "Legacy-named symbol `schemas_v2` in backend/app/services/bundle_opportunities.py:16"}, "properties": {"repobilityId": "4a2c6b1a904281e3", "scanner": "scanner-primary", "fingerprint": "4b5da48a405a2cfd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d30f85c43b86dcf0", "level": "note", "message": {"text": "27 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "4816db1c74a26e4a", "scanner": "scanner-primary", "fingerprint": "d30f85c43b86dcf0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "028e0f98a5733688", "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": "7dcf87b9a593c7c9", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6ace794e91e3b6fc", "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": "8e53b02a5bffc8aa", "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": "1aa73f59c5fd0bc0", "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": "5416334939a5d73b", "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": "3d6cf32335badb8b", "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": "2b8c70165e90264c", "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": "1d36ca90cae84fe0", "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": "29467fd6e93bb0d8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-336fd3f7f152d846", "level": "error", "message": {"text": "FastAPI POST `customers_data_request` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:82"}, "properties": {"repobilityId": "986efe1d42d62452", "scanner": "scanner-primary", "fingerprint": "336fd3f7f152d846", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/routes/shopify_privacy_webhooks.py"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-421f5fe2b73e1dba", "level": "error", "message": {"text": "FastAPI POST `customers_redact` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:105"}, "properties": {"repobilityId": "3ed5ebd852d7b14f", "scanner": "scanner-primary", "fingerprint": "421f5fe2b73e1dba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/routes/shopify_privacy_webhooks.py"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-a4d8c36a333b1acf", "level": "error", "message": {"text": "FastAPI POST `shop_redact` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:127"}, "properties": {"repobilityId": "5543f4c5cbc8bfa3", "scanner": "scanner-primary", "fingerprint": "a4d8c36a333b1acf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/routes/shopify_privacy_webhooks.py"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-33142e58d4e8099d", "level": "error", "message": {"text": "FastAPI POST `app_uninstalled` without auth dependency \u2014 backend/app/api/routes/shopify_privacy_webhooks.py:154"}, "properties": {"repobilityId": "1d8793bdbc1f0463", "scanner": "scanner-primary", "fingerprint": "33142e58d4e8099d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/routes/shopify_privacy_webhooks.py"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-66d0e133437a0f6b", "level": "error", "message": {"text": "FastAPI POST `submit` without auth dependency \u2014 backend/app/api/routes/contact.py:31"}, "properties": {"repobilityId": "c4015f2da5befe1b", "scanner": "scanner-primary", "fingerprint": "66d0e133437a0f6b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/routes/contact.py"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-be4cb5e3cabcce80", "level": "note", "message": {"text": "Unused endpoint: POST /import"}, "properties": {"repobilityId": "92ac3fc29d791b9c", "scanner": "scanner-primary", "fingerprint": "be4cb5e3cabcce80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d16b1bb2723f51e", "level": "note", "message": {"text": "Unused endpoint: POST /signup"}, "properties": {"repobilityId": "35171ed37918e48f", "scanner": "scanner-primary", "fingerprint": "8d16b1bb2723f51e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5d6e2a62d2d0d400", "level": "note", "message": {"text": "Unused endpoint: GET /count"}, "properties": {"repobilityId": "8e966e7cc4cd21fe", "scanner": "scanner-primary", "fingerprint": "5d6e2a62d2d0d400", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-80452db3fde88b33", "level": "note", "message": {"text": "Unused endpoint: POST /customers/data_request"}, "properties": {"repobilityId": "ee4b10a865d002f2", "scanner": "scanner-primary", "fingerprint": "80452db3fde88b33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74dadb1612c03753", "level": "note", "message": {"text": "Unused endpoint: POST /customers/redact"}, "properties": {"repobilityId": "816c645226096552", "scanner": "scanner-primary", "fingerprint": "74dadb1612c03753", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b457f0f0112d7278", "level": "note", "message": {"text": "Unused endpoint: POST /shop/redact"}, "properties": {"repobilityId": "f6f88d6515d91bc9", "scanner": "scanner-primary", "fingerprint": "b457f0f0112d7278", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9628d0e72d28fca4", "level": "note", "message": {"text": "Unused endpoint: POST /app/uninstalled"}, "properties": {"repobilityId": "ff2efe4570640971", "scanner": "scanner-primary", "fingerprint": "9628d0e72d28fca4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "1afc827b67e2880d", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2719debabc49d25c", "level": "note", "message": {"text": "Unused endpoint: GET /{sku_id}"}, "properties": {"repobilityId": "87770b4f0936b7fd", "scanner": "scanner-primary", "fingerprint": "2719debabc49d25c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-178ecbc535b52d35", "level": "note", "message": {"text": "Unused endpoint: GET /buying-calendar"}, "properties": {"repobilityId": "636afa388f6d0b93", "scanner": "scanner-primary", "fingerprint": "178ecbc535b52d35", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37b389c3d4577b1f", "level": "note", "message": {"text": "Unused endpoint: GET /cash-plan"}, "properties": {"repobilityId": "607b31adff51e6e8", "scanner": "scanner-primary", "fingerprint": "37b389c3d4577b1f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-decdc4e27e83d653", "level": "note", "message": {"text": "Unused endpoint: GET /purchase-orders"}, "properties": {"repobilityId": "9696308505230a25", "scanner": "scanner-primary", "fingerprint": "decdc4e27e83d653", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2459316cb8c91180", "level": "note", "message": {"text": "Unused endpoint: POST /purchase-orders"}, "properties": {"repobilityId": "53dacf1daf67a333", "scanner": "scanner-primary", "fingerprint": "2459316cb8c91180", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f776ad247557b36b", "level": "note", "message": {"text": "Unused endpoint: POST /purchase-orders/{po_id}/status"}, "properties": {"repobilityId": "524e285500ab645b", "scanner": "scanner-primary", "fingerprint": "f776ad247557b36b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dee462608372b5fa", "level": "note", "message": {"text": "Unused endpoint: POST /purchase-orders/{po_id}/receive"}, "properties": {"repobilityId": "b914600357311e6f", "scanner": "scanner-primary", "fingerprint": "dee462608372b5fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f338a686474ff259", "level": "note", "message": {"text": "Unused endpoint: GET /install"}, "properties": {"repobilityId": "fc89c6ddfb6a6672", "scanner": "scanner-primary", "fingerprint": "f338a686474ff259", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdfb578618cf2542", "level": "note", "message": {"text": "Unused endpoint: GET /callback"}, "properties": {"repobilityId": "3c8bf3ae3adff8d3", "scanner": "scanner-primary", "fingerprint": "cdfb578618cf2542", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e188e6cf6a89278f", "level": "note", "message": {"text": "Unused endpoint: GET /connection"}, "properties": {"repobilityId": "85d2cef754f87e27", "scanner": "scanner-primary", "fingerprint": "e188e6cf6a89278f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa413208496243a5", "level": "note", "message": {"text": "Unused endpoint: POST /sync"}, "properties": {"repobilityId": "f5e7ee38bbd60371", "scanner": "scanner-primary", "fingerprint": "fa413208496243a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b7bee247ffc801", "level": "note", "message": {"text": "Unused endpoint: GET /summary"}, "properties": {"repobilityId": "3e4380c32b6ab994", "scanner": "scanner-primary", "fingerprint": "e1b7bee247ffc801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52c40df350200e83", "level": "note", "message": {"text": "Unused endpoint: POST /leads"}, "properties": {"repobilityId": "c6a46ff113d350b7", "scanner": "scanner-primary", "fingerprint": "52c40df350200e83", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb19a2be7a6629c", "level": "note", "message": {"text": "Unused endpoint: GET /leads"}, "properties": {"repobilityId": "9c6efe8689616b02", "scanner": "scanner-primary", "fingerprint": "6eb19a2be7a6629c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa04acb9d5b0bdf7", "level": "note", "message": {"text": "Unused endpoint: GET /leads/export.csv"}, "properties": {"repobilityId": "04305cfd07e412e8", "scanner": "scanner-primary", "fingerprint": "aa04acb9d5b0bdf7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-80530b1e8c346fb1", "level": "note", "message": {"text": "Unused endpoint: GET /leads/export.xlsx"}, "properties": {"repobilityId": "0ad13506f3826667", "scanner": "scanner-primary", "fingerprint": "80530b1e8c346fb1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f53301a3dc7875d3", "level": "note", "message": {"text": "Unused endpoint: POST /magic-link/request"}, "properties": {"repobilityId": "1dfe4f2ab2b1e3c5", "scanner": "scanner-primary", "fingerprint": "f53301a3dc7875d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-78c145251a7b78a8", "level": "note", "message": {"text": "Unused endpoint: POST /magic-link/verify"}, "properties": {"repobilityId": "53ef94697f1fd0a0", "scanner": "scanner-primary", "fingerprint": "78c145251a7b78a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "1353cb6e09245ca9", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "0fc00699633911b7", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ba440796d8deb66", "level": "note", "message": {"text": "Unused endpoint: GET /scorecards"}, "properties": {"repobilityId": "b89bef25d36afcf8", "scanner": "scanner-primary", "fingerprint": "2ba440796d8deb66", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec97c873980071be", "level": "note", "message": {"text": "Unused endpoint: GET /inventory-value"}, "properties": {"repobilityId": "f60d35cab7c6b44f", "scanner": "scanner-primary", "fingerprint": "ec97c873980071be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c360006dbbbee4ac", "level": "note", "message": {"text": "Unused endpoint: GET /inventory-health"}, "properties": {"repobilityId": "eb92f310dbc5868d", "scanner": "scanner-primary", "fingerprint": "c360006dbbbee4ac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67d28fa8cd6bb12f", "level": "note", "message": {"text": "Unused endpoint: PUT /"}, "properties": {"repobilityId": "97a9c9f13d9b55d4", "scanner": "scanner-primary", "fingerprint": "67d28fa8cd6bb12f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3fa3953e23b25818", "level": "note", "message": {"text": "Unused endpoint: GET /vendor-lead-times"}, "properties": {"repobilityId": "dfe6620fd24f2de2", "scanner": "scanner-primary", "fingerprint": "3fa3953e23b25818", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b5ec5fa7c037599", "level": "note", "message": {"text": "Unused endpoint: PUT /vendor-lead-times"}, "properties": {"repobilityId": "afb8cf8f3bc0d72a", "scanner": "scanner-primary", "fingerprint": "3b5ec5fa7c037599", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d7d761da86c34c8", "level": "note", "message": {"text": "Unused endpoint: GET /category-lead-times"}, "properties": {"repobilityId": "5b235228ae34bb08", "scanner": "scanner-primary", "fingerprint": "8d7d761da86c34c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85f36f6a7457a4c1", "level": "note", "message": {"text": "Unused endpoint: PUT /category-lead-times"}, "properties": {"repobilityId": "fcd83ed9b4b299e9", "scanner": "scanner-primary", "fingerprint": "85f36f6a7457a4c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c91ed7b97d98b2c", "level": "note", "message": {"text": "Unused endpoint: GET /sku-lead-times"}, "properties": {"repobilityId": "44927a4f8ea03dce", "scanner": "scanner-primary", "fingerprint": "9c91ed7b97d98b2c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0c7bf9d646da03e", "level": "note", "message": {"text": "Unused endpoint: PUT /sku-lead-times"}, "properties": {"repobilityId": "9d36440cd005d4b4", "scanner": "scanner-primary", "fingerprint": "a0c7bf9d646da03e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e9b48dd151de62c", "level": "note", "message": {"text": "Unused endpoint: GET /dead-stock-pairings"}, "properties": {"repobilityId": "cbe161be7ec5f2b4", "scanner": "scanner-primary", "fingerprint": "2e9b48dd151de62c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46eb93a4accdc83b", "level": "note", "message": {"text": "Unused endpoint: POST /invite"}, "properties": {"repobilityId": "40bcf8d516453ece", "scanner": "scanner-primary", "fingerprint": "46eb93a4accdc83b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-841e50bf821e4158", "level": "note", "message": {"text": "Unused endpoint: GET /users"}, "properties": {"repobilityId": "bc3ce4525a16faf1", "scanner": "scanner-primary", "fingerprint": "841e50bf821e4158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e42f43fc121948e6", "level": "note", "message": {"text": "Unused endpoint: POST /billing/reconcile"}, "properties": {"repobilityId": "ffc892a7f9b04ff6", "scanner": "scanner-primary", "fingerprint": "e42f43fc121948e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cff8da5fbc19c76d", "level": "note", "message": {"text": "Unused endpoint: POST /chat"}, "properties": {"repobilityId": "71087df04cc77b55", "scanner": "scanner-primary", "fingerprint": "cff8da5fbc19c76d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-26bf5f94d883f709", "level": "note", "message": {"text": "Unused endpoint: GET /rules"}, "properties": {"repobilityId": "281c9c02f3295d66", "scanner": "scanner-primary", "fingerprint": "26bf5f94d883f709", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d91a7845c35d0f8f", "level": "note", "message": {"text": "Unused endpoint: POST /rules"}, "properties": {"repobilityId": "5f08b3e0505d895c", "scanner": "scanner-primary", "fingerprint": "d91a7845c35d0f8f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-778993ec577548b6", "level": "note", "message": {"text": "Unused endpoint: DELETE /rules/{rule_id}"}, "properties": {"repobilityId": "c2f3a394326054ce", "scanner": "scanner-primary", "fingerprint": "778993ec577548b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7acef55ead004203", "level": "note", "message": {"text": "Unused endpoint: PATCH /rules/{rule_id}/toggle"}, "properties": {"repobilityId": "502949ed91d59462", "scanner": "scanner-primary", "fingerprint": "7acef55ead004203", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0b9bdc04b58bea3", "level": "note", "message": {"text": "Unused endpoint: GET /channels"}, "properties": {"repobilityId": "20b591697e795450", "scanner": "scanner-primary", "fingerprint": "e0b9bdc04b58bea3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-14a78266393888c7", "level": "note", "message": {"text": "Unused endpoint: POST /channels"}, "properties": {"repobilityId": "2103a59b937956b2", "scanner": "scanner-primary", "fingerprint": "14a78266393888c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-731c57f59aaca553", "level": "note", "message": {"text": "Unused endpoint: POST /test"}, "properties": {"repobilityId": "a81f74e896b60603", "scanner": "scanner-primary", "fingerprint": "731c57f59aaca553", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}