{"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-33d62581d080af9b", "name": "Possibly dead Python function: update_session_status", "shortDescription": {"text": "Possibly dead Python function: update_session_status"}, "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-c5241e8529c1ca70", "name": "Possibly dead Python function: tool_call", "shortDescription": {"text": "Possibly dead Python function: tool_call"}, "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-9ff54caec79e8df6", "name": "Possibly dead Python function: export_to_csv", "shortDescription": {"text": "Possibly dead Python function: export_to_csv"}, "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-ba00e86d5e84b2be", "name": "Possibly dead Python function: capture_contact_info", "shortDescription": {"text": "Possibly dead Python function: capture_contact_info"}, "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-ca279b39f5f2568a", "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-055adfa9fba9b590", "name": "Possibly dead Python function: require_partner_api_key", "shortDescription": {"text": "Possibly dead Python function: require_partner_api_key"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-61e9cd4724cc09f7", "name": "Possibly dead Python function: maybe_trigger_automated_signing", "shortDescription": {"text": "Possibly dead Python function: maybe_trigger_automated_signing"}, "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-45ce8fbbcb2a42df", "name": "Possibly dead Python function: business_email", "shortDescription": {"text": "Possibly dead Python function: business_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-164952c9903202e4", "name": "Possibly dead Python function: agent_name", "shortDescription": {"text": "Possibly dead Python function: agent_name"}, "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-4eeaabfddfeb29cc", "name": "Possibly dead Python function: product_type", "shortDescription": {"text": "Possibly dead Python function: product_type"}, "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-297758799834d7f2", "name": "Possibly dead Python function: cache_delete", "shortDescription": {"text": "Possibly dead Python function: cache_delete"}, "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-4ffabcd58aa72676", "name": "Possibly dead Python function: probe", "shortDescription": {"text": "Possibly dead Python function: probe"}, "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-0ce900efa8709e3c", "name": "Possibly dead Python function: check_manufacturer_cdn", "shortDescription": {"text": "Possibly dead Python function: check_manufacturer_cdn"}, "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-5e98b52549ca3019", "name": "Stray `console.log` in TS/JS \u2014 tools/firebase_import.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/firebase_import.js:35"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a68c9df131648fb9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PropertyCard.jsx:273", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PropertyCard.jsx:273"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-500904fdd6d63650", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/components/ReportIssue.jsx:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/ReportIssue.jsx:36"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83552abcfe259d0a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SystemHub.jsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SystemHub.jsx:139"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0fe461d9e4695a50", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DocumentCenter.jsx:996", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DocumentCenter.jsx:996"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d7f43180bdda9ef5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/CRM.jsx:761", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/CRM.jsx:761"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eecec6df1449548c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Analytics.jsx:492", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Analytics.jsx:492"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42df0abfce3ad757", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SecureHub.jsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SecureHub.jsx:185"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff93c30453722041", "name": "Privileged port 12 in use", "shortDescription": {"text": "Privileged port 12 in use"}, "fullDescription": {"text": "Port 12 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b71c2c2064cbe2a3", "name": "Privileged port 18 in use", "shortDescription": {"text": "Privileged port 18 in use"}, "fullDescription": {"text": "Port 18 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-632854da18426b3e", "name": "Privileged port 17 in use", "shortDescription": {"text": "Privileged port 17 in use"}, "fullDescription": {"text": "Port 17 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7de3a24cdbe4234e", "name": "Privileged port 15 in use", "shortDescription": {"text": "Privileged port 15 in use"}, "fullDescription": {"text": "Port 15 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e066691601852931", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a35c6a00f751880f", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-66071218eacac76c", "name": "Dockerfile runs as root: services/docuseal/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: services/docuseal/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4a361e5f10a426d2", "name": "Docker base image uses a mutable or implicit tag: docuseal/docuseal:latest", "shortDescription": {"text": "Docker base image uses a mutable or implicit tag: docuseal/docuseal:latest"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c57cdd0dcc05b624", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/App.jsx:339", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/App.jsx:339"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1ea7635c309e2d44", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "google-github-actions/auth@v2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ebb8c5027c8752d3", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2aca8efa8750fcc7", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "google-github-actions/auth@v2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d3cac716f974a3a", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad6701f0a8405e22", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8933a55d2b5015ad", "name": "Very large file: main.py (6158 lines)", "shortDescription": {"text": "Very large file: main.py (6158 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-af7049ceb18fd06b", "name": "Very large file: tests/test_api_v1.py (2068 lines)", "shortDescription": {"text": "Very large file: tests/test_api_v1.py (2068 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-cdd26bb77c3adc13", "name": "Very large file: tools/marketing_tools.py (2135 lines)", "shortDescription": {"text": "Very large file: tools/marketing_tools.py (2135 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-9a32e14769da9876", "name": "Very large file: frontend/src/App.jsx (1489 lines)", "shortDescription": {"text": "Very large file: frontend/src/App.jsx (1489 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-3e503035c6763f5e", "name": "Very large file: frontend/src/pages/DocumentCenter.jsx (3835 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/DocumentCenter.jsx (3835 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-b24dcf5294a7112a", "name": "Very large file: frontend/src/pages/CRM.jsx (1787 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/CRM.jsx (1787 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-b028a0d70833e8bd", "name": "Very large file: frontend/src/pages/AdStudio.jsx (2116 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/AdStudio.jsx (2116 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-bfb088597245fad5", "name": "Very large file: frontend/src/pages/InventoryBrowse.jsx (1747 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/InventoryBrowse.jsx (1747 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 277 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 88 placeholder/mock markers across 27 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-93cafdd22e9bc0d8", "name": "Commented-code block (8 lines) in seo_routes.py:117", "shortDescription": {"text": "Commented-code block (8 lines) in seo_routes.py:117"}, "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-5b629709d93624c9", "name": "Legacy-named symbol `d_v1` in main.py:1307", "shortDescription": {"text": "Legacy-named symbol `d_v1` in main.py:1307"}, "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-ca57f23b3b07fb83", "name": "Commented-code block (6 lines) in main.py:266", "shortDescription": {"text": "Commented-code block (6 lines) in main.py:266"}, "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-b90ff46dc7eacc17", "name": "Commented-code block (10 lines) in caching.py:7", "shortDescription": {"text": "Commented-code block (10 lines) in caching.py:7"}, "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-7fa038a6f370931d", "name": "Legacy-named symbol `document_engine_v2` in tests/test_document_quality.py:4", "shortDescription": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_document_quality.py:4"}, "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-26f1b4925c36ed8c", "name": "Legacy-named symbol `document_engine_v2` in tests/test_packet_no_blank_pages.py:28", "shortDescription": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_packet_no_blank_pages.py:28"}, "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-d88d3e3c78c0f151", "name": "Legacy-named symbol `document_engine_v2` in tests/test_document_engine_v2.py:8", "shortDescription": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_document_engine_v2.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-bdd90965deed6000", "name": "Legacy-named symbol `test_api_v1` in tests/test_feedback.py:9", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_feedback.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-c571b65ae387d4df", "name": "Legacy-named symbol `document_engine_v2` in tests/test_document_fill_completeness.py:81", "shortDescription": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_document_fill_completeness.py:81"}, "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-0374a0b1b2c65e78", "name": "Legacy-named symbol `test_api_v1` in tests/test_inventory_validation.py:24", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_inventory_validation.py:24"}, "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-c621c254f4dd58d7", "name": "Legacy-named symbol `test_api_v1` in tests/test_error_responses.py:24", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_error_responses.py:24"}, "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-e3893a0c62bc6bf5", "name": "Legacy-named symbol `test_api_v1` in tests/test_seo_routes.py:15", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_seo_routes.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-1e533f8c1b349bd6", "name": "Legacy-named symbol `test_api_v1` in tests/test_healthz.py:8", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_healthz.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-5f3747bcc1300cf6", "name": "Legacy-named symbol `test_api_v1` in tests/test_audit_log.py:24", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_audit_log.py:24"}, "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-886f9a84bef217f0", "name": "Legacy-named symbol `test_api_v1` in tests/test_documents_share.py:25", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_documents_share.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-1579dcf57d3c7cdd", "name": "Legacy-named symbol `test_api_v1` in tests/test_deal_document_validation.py:217", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_deal_document_validation.py:217"}, "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-848a6a9727056729", "name": "Commented-code block (5 lines) in tests/test_deal_document_validation.py:229", "shortDescription": {"text": "Commented-code block (5 lines) in tests/test_deal_document_validation.py:229"}, "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-e44cdaeeac8cd6d9", "name": "Legacy-named symbol `test_api_v1` in tests/test_api_v1.py:3", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_api_v1.py:3"}, "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-f028315da606c143", "name": "Commented-code block (6 lines) in tests/test_migration.py:17", "shortDescription": {"text": "Commented-code block (6 lines) in tests/test_migration.py:17"}, "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-5a5dddd3d338ece9", "name": "Commented-code block (6 lines) in tests/test_inventory_tools_firestore.py:36", "shortDescription": {"text": "Commented-code block (6 lines) in tests/test_inventory_tools_firestore.py:36"}, "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-1340e2adb5860b02", "name": "Legacy-named symbol `test_api_v1` in tests/test_admin_auth.py:173", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_admin_auth.py:173"}, "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-6be6c42b75a48cf2", "name": "Legacy-named symbol `test_api_v1` in tests/test_crm_tasks.py:14", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_crm_tasks.py:14"}, "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-c37e4e25634db617", "name": "Legacy-named symbol `test_api_v1` in tests/test_document_rag.py:4", "shortDescription": {"text": "Legacy-named symbol `test_api_v1` in tests/test_document_rag.py:4"}, "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-4ff20b913d93332b", "name": "Legacy-named symbol `document_engine_v2` in tests/test_seller_name_by_category.py:14", "shortDescription": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_seller_name_by_category.py:14"}, "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-51333ce16123eb68", "name": "Legacy-named symbol `document_engine_v2` in tests/test_smoke_empty_deal.py:377", "shortDescription": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_smoke_empty_deal.py:377"}, "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-b13df45e5be2721f", "name": "Legacy-named symbol `document_engine_v2` in scripts/validate_document_fills.py:46", "shortDescription": {"text": "Legacy-named symbol `document_engine_v2` in scripts/validate_document_fills.py:46"}, "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-b86ee199eb226ff7", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/validate_document_fills.py:178", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/validate_document_fills.py:178"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-960e6019daf074af", "name": "Stub function `cache_get` (body is just `pass`/`return`) \u2014 tools/inventory_tools.py:26", "shortDescription": {"text": "Stub function `cache_get` (body is just `pass`/`return`) \u2014 tools/inventory_tools.py:26"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1166b3d3a4cef91c", "name": "Commented-code block (7 lines) in tools/document_tools.py:568", "shortDescription": {"text": "Commented-code block (7 lines) in tools/document_tools.py:568"}, "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-a63a34a88f6a7523", "name": "Legacy-named symbol `unified_schema_v2` in tools/document_engine_v2.py:608", "shortDescription": {"text": "Legacy-named symbol `unified_schema_v2` in tools/document_engine_v2.py:608"}, "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-98a019d22ff0a504", "name": "Stub function `build` (body is just `pass`/`return`) \u2014 tools/drive_service.py:25", "shortDescription": {"text": "Stub function `build` (body is just `pass`/`return`) \u2014 tools/drive_service.py:25"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9064f89d5fc0af2", "name": "Legacy-named symbol `legacy_site_inventory_context_v2` in tools/legacy_site_crawler.py:50", "shortDescription": {"text": "Legacy-named symbol `legacy_site_inventory_context_v2` in tools/legacy_site_crawler.py:50"}, "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-fcae9197b7734a71", "name": "Commented-code block (5 lines) in tools/document_quality.py:15", "shortDescription": {"text": "Commented-code block (5 lines) in tools/document_quality.py:15"}, "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-528193a969c9f651", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/App.jsx:340", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/App.jsx:340"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db1a1744352ca2cd", "name": "Commented-code block (5 lines) in frontend/src/components/PropertyCard.jsx:151", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/PropertyCard.jsx:151"}, "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-711c748ade62475a", "name": "Commented-code block (6 lines) in frontend/src/pages/DocumentCenter.jsx:73", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/pages/DocumentCenter.jsx:73"}, "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-34ca652d34860f2c", "name": "Commented-code block (5 lines) in frontend/src/pages/InventoryBrowse.jsx:549", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/InventoryBrowse.jsx:549"}, "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-0c9d02364e09e13c", "name": "55 env vars used in code but missing from .env.example", "shortDescription": {"text": "55 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_SESSION_SECRET`, `AI_RUN_TIMEOUT`, `APP_VERSION`, `CANONICAL_PUBLIC_URL`, `DEV`, `DOCUMENT_HISTORY_MIN_CREATED_AT`, `DOCUMENT_HISTORY_QUARANTINE_MARKERS`, `DOCUSEAL_API_TOKEN` + 47 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:\nchat_history.py:to_dict, chat_history.py:to_dict\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nmain.py:dispatch, main.py:dispatch, main.py:dispatch, main.py:dispatch\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:\ntools/house_orders_sanitizer.py:to_dict, tools/house_orders_sanitizer.py:to_dict, tools/house_orders_sanitizer.py:to_dict\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-5bd4654bc5027997", "name": "FastAPI POST `create_project` without auth dependency \u2014 pm_routes.py:37", "shortDescription": {"text": "FastAPI POST `create_project` without auth dependency \u2014 pm_routes.py:37"}, "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-a3d33f96132c008f", "name": "FastAPI PATCH `update_project` without auth dependency \u2014 pm_routes.py:75", "shortDescription": {"text": "FastAPI PATCH `update_project` without auth dependency \u2014 pm_routes.py:75"}, "fullDescription": {"text": "`@router.patch` 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-6d2faee22d1ac394", "name": "FastAPI POST `create_task` without auth dependency \u2014 pm_routes.py:96", "shortDescription": {"text": "FastAPI POST `create_task` without auth dependency \u2014 pm_routes.py:96"}, "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-aed8a3cf6c572d12", "name": "FastAPI PATCH `update_task` without auth dependency \u2014 pm_routes.py:157", "shortDescription": {"text": "FastAPI PATCH `update_task` without auth dependency \u2014 pm_routes.py:157"}, "fullDescription": {"text": "`@router.patch` 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-7ef403e53d45d08e", "name": "FastAPI POST `transition_task` without auth dependency \u2014 pm_routes.py:189", "shortDescription": {"text": "FastAPI POST `transition_task` without auth dependency \u2014 pm_routes.py:189"}, "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-0b2229845dd2ffcf", "name": "FastAPI POST `create_cycle` without auth dependency \u2014 pm_routes.py:223", "shortDescription": {"text": "FastAPI POST `create_cycle` without auth dependency \u2014 pm_routes.py:223"}, "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-2d88af8167d7d429", "name": "FastAPI POST `create_view` without auth dependency \u2014 pm_routes.py:283", "shortDescription": {"text": "FastAPI POST `create_view` without auth dependency \u2014 pm_routes.py:283"}, "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-90c45c670fe686ad", "name": "FastAPI POST `import_github_issues` without auth dependency \u2014 pm_routes.py:353", "shortDescription": {"text": "FastAPI POST `import_github_issues` without auth dependency \u2014 pm_routes.py:353"}, "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-616d589d67f214a7", "name": "FastAPI POST `passkey_logout` without auth dependency \u2014 auth/routes.py:676", "shortDescription": {"text": "FastAPI POST `passkey_logout` without auth dependency \u2014 auth/routes.py:676"}, "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-041340186832da9f", "name": "Dangling fetch: GET /api/admin/passkey/status (frontend/src/App.jsx:442)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/passkey/status (frontend/src/App.jsx:442)"}, "fullDescription": {"text": "`frontend/src/App.jsx:442` calls `GET /api/admin/passkey/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/passkey/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0c70a0442294c0c6", "name": "Dangling fetch: POST /api/admin/passkey/login/begin (frontend/src/App.jsx:468)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/passkey/login/begin (frontend/src/App.jsx:468)"}, "fullDescription": {"text": "`frontend/src/App.jsx:468` calls `POST /api/admin/passkey/login/begin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/passkey/login/begin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-51677ce411903e36", "name": "Dangling fetch: POST /api/admin/passkey/login/complete (frontend/src/App.jsx:495)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/passkey/login/complete (frontend/src/App.jsx:495)"}, "fullDescription": {"text": "`frontend/src/App.jsx:495` calls `POST /api/admin/passkey/login/complete` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/passkey/login/complete`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-386c0aef27835fba", "name": "Dangling fetch: POST /api/admin/passkey/register/begin (frontend/src/App.jsx:541)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/passkey/register/begin (frontend/src/App.jsx:541)"}, "fullDescription": {"text": "`frontend/src/App.jsx:541` calls `POST /api/admin/passkey/register/begin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/passkey/register/begin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5a2213e2291793b1", "name": "Dangling fetch: POST /api/admin/passkey/register/complete (frontend/src/App.jsx:572)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/passkey/register/complete (frontend/src/App.jsx:572)"}, "fullDescription": {"text": "`frontend/src/App.jsx:572` calls `POST /api/admin/passkey/register/complete` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/passkey/register/complete`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e21e8945cc9890f4", "name": "Dangling fetch: GET /api/admin/passkey/status (frontend/src/pages/SystemHub.jsx:270)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/passkey/status (frontend/src/pages/SystemHub.jsx:270)"}, "fullDescription": {"text": "`frontend/src/pages/SystemHub.jsx:270` calls `GET /api/admin/passkey/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/passkey/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-69a693dfc33637f4", "name": "Unused endpoint: POST /run", "shortDescription": {"text": "Unused endpoint: POST /run"}, "fullDescription": {"text": "`main.py` declares `POST /run` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ecc82226d4dc8f8", "name": "Unused endpoint: GET /leads/export", "shortDescription": {"text": "Unused endpoint: GET /leads/export"}, "fullDescription": {"text": "`main.py` declares `GET /leads/export` 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-a5ffe7d39f9b8c78", "name": "Unused endpoint: GET /leads/stats", "shortDescription": {"text": "Unused endpoint: GET /leads/stats"}, "fullDescription": {"text": "`main.py` declares `GET /leads/stats` 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-875ad1135b47d685", "name": "Unused endpoint: GET /api/admin/crm/lead-sources", "shortDescription": {"text": "Unused endpoint: GET /api/admin/crm/lead-sources"}, "fullDescription": {"text": "`main.py` declares `GET /api/admin/crm/lead-sources` 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-730a7ed99dc8f2d7", "name": "Unused endpoint: GET /api/analytics/leads", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/leads"}, "fullDescription": {"text": "`main.py` declares `GET /api/analytics/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-e7600880faa7ed4b", "name": "Unused endpoint: GET /api/analytics/documents", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/documents"}, "fullDescription": {"text": "`main.py` declares `GET /api/analytics/documents` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed0d74fd158e6b2b", "name": "Unused endpoint: GET /api/analytics/inventory", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/inventory"}, "fullDescription": {"text": "`main.py` declares `GET /api/analytics/inventory` 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-40f1d06104882fce", "name": "Unused endpoint: GET /api/analytics/chat", "shortDescription": {"text": "Unused endpoint: GET /api/analytics/chat"}, "fullDescription": {"text": "`main.py` declares `GET /api/analytics/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-e1abfb4ffbcb62ed", "name": "Unused endpoint: ANY /llms.txt", "shortDescription": {"text": "Unused endpoint: ANY /llms.txt"}, "fullDescription": {"text": "`main.py` declares `ANY /llms.txt` 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-000a90e8ffb2ba65", "name": "Unused endpoint: POST /apps/{app_name}/users/{user_id}/sessions/{session_id}", "shortDescription": {"text": "Unused endpoint: POST /apps/{app_name}/users/{user_id}/sessions/{session_id}"}, "fullDescription": {"text": "`main.py` declares `POST /apps/{app_name}/users/{user_id}/sessions/{session_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-a5e8c1b53e018fba", "name": "Unused endpoint: GET /api/documents/templates", "shortDescription": {"text": "Unused endpoint: GET /api/documents/templates"}, "fullDescription": {"text": "`main.py` declares `GET /api/documents/templates` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85cb92f3e704978c", "name": "Unused endpoint: GET /api/document-templates", "shortDescription": {"text": "Unused endpoint: GET /api/document-templates"}, "fullDescription": {"text": "`main.py` declares `GET /api/document-templates` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-218d2b9a26f37404", "name": "Unused endpoint: GET /api/documents/readiness", "shortDescription": {"text": "Unused endpoint: GET /api/documents/readiness"}, "fullDescription": {"text": "`main.py` declares `GET /api/documents/readiness` 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-e830762dbdba1c0c", "name": "Unused endpoint: POST /api/documents/generate", "shortDescription": {"text": "Unused endpoint: POST /api/documents/generate"}, "fullDescription": {"text": "`main.py` declares `POST /api/documents/generate` 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-f0a39ae9c1170447", "name": "Unused endpoint: POST /api/documents/generate-packet", "shortDescription": {"text": "Unused endpoint: POST /api/documents/generate-packet"}, "fullDescription": {"text": "`main.py` declares `POST /api/documents/generate-packet` 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-b53666d8f53f890e", "name": "Unused endpoint: GET /api/documents/fields", "shortDescription": {"text": "Unused endpoint: GET /api/documents/fields"}, "fullDescription": {"text": "`main.py` declares `GET /api/documents/fields` 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-8aa0fc23ad61ca64", "name": "Unused endpoint: POST /api/documents/generate-batch", "shortDescription": {"text": "Unused endpoint: POST /api/documents/generate-batch"}, "fullDescription": {"text": "`main.py` declares `POST /api/documents/generate-batch` 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-9ed7a5a11cd4a03a", "name": "Unused endpoint: POST /api/documents/sales-contract", "shortDescription": {"text": "Unused endpoint: POST /api/documents/sales-contract"}, "fullDescription": {"text": "`main.py` declares `POST /api/documents/sales-contract` 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-7545746ff77b48cd", "name": "Unused endpoint: GET /api/documents/download/{filename}", "shortDescription": {"text": "Unused endpoint: GET /api/documents/download/{filename}"}, "fullDescription": {"text": "`main.py` declares `GET /api/documents/download/{filename}` 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-d7a86a4aa518df0d", "name": "Unused endpoint: GET /api/inventory", "shortDescription": {"text": "Unused endpoint: GET /api/inventory"}, "fullDescription": {"text": "`main.py` declares `GET /api/inventory` 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-da200bab0f258534", "name": "Unused endpoint: GET /api/admin/inventory/photo-audit", "shortDescription": {"text": "Unused endpoint: GET /api/admin/inventory/photo-audit"}, "fullDescription": {"text": "`main.py` declares `GET /api/admin/inventory/photo-audit` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b1d0ae7e1e53ae7", "name": "Unused endpoint: POST /api/inventory/bulk-import", "shortDescription": {"text": "Unused endpoint: POST /api/inventory/bulk-import"}, "fullDescription": {"text": "`main.py` declares `POST /api/inventory/bulk-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-728472ea7896b76c", "name": "Unused endpoint: GET /api/deals", "shortDescription": {"text": "Unused endpoint: GET /api/deals"}, "fullDescription": {"text": "`main.py` declares `GET /api/deals` 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-034d42a6575c2724", "name": "Unused endpoint: POST /api/deals", "shortDescription": {"text": "Unused endpoint: POST /api/deals"}, "fullDescription": {"text": "`main.py` declares `POST /api/deals` 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-236c7fdf89c4d855", "name": "Unused endpoint: GET /api/deals/{deal_id}", "shortDescription": {"text": "Unused endpoint: GET /api/deals/{deal_id}"}, "fullDescription": {"text": "`main.py` declares `GET /api/deals/{deal_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-ad222d06f2f81188", "name": "Unused endpoint: PUT /api/deals/{deal_id}", "shortDescription": {"text": "Unused endpoint: PUT /api/deals/{deal_id}"}, "fullDescription": {"text": "`main.py` declares `PUT /api/deals/{deal_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-b7dd796394c7c18c", "name": "Unused endpoint: PUT /api/deals/{deal_id}/status", "shortDescription": {"text": "Unused endpoint: PUT /api/deals/{deal_id}/status"}, "fullDescription": {"text": "`main.py` declares `PUT /api/deals/{deal_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-ff9ac1c8efa64d6d", "name": "Unused endpoint: POST /api/deals/{deal_id}/generate-document", "shortDescription": {"text": "Unused endpoint: POST /api/deals/{deal_id}/generate-document"}, "fullDescription": {"text": "`main.py` declares `POST /api/deals/{deal_id}/generate-document` 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-691af80c6428b2f7", "name": "Unused endpoint: POST /api/deals/{deal_id}/generate-packet", "shortDescription": {"text": "Unused endpoint: POST /api/deals/{deal_id}/generate-packet"}, "fullDescription": {"text": "`main.py` declares `POST /api/deals/{deal_id}/generate-packet` 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-e5a50e3a432738f3", "name": "Unused endpoint: POST /api/docuseal/send", "shortDescription": {"text": "Unused endpoint: POST /api/docuseal/send"}, "fullDescription": {"text": "`main.py` declares `POST /api/docuseal/send` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-908392af6281efa7", "name": "Unused endpoint: POST /api/docuseal/webhook", "shortDescription": {"text": "Unused endpoint: POST /api/docuseal/webhook"}, "fullDescription": {"text": "`main.py` declares `POST /api/docuseal/webhook` 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-0847d508d8dfeb03", "name": "Unused endpoint: POST /api/marketing/generate-script", "shortDescription": {"text": "Unused endpoint: POST /api/marketing/generate-script"}, "fullDescription": {"text": "`main.py` declares `POST /api/marketing/generate-script` 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-9f4e9e900e0e839a", "name": "Unused endpoint: GET /api/marketing/trending-ideas", "shortDescription": {"text": "Unused endpoint: GET /api/marketing/trending-ideas"}, "fullDescription": {"text": "`main.py` declares `GET /api/marketing/trending-ideas` 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-423fbc2f2b434c7e", "name": "Unused endpoint: POST /api/marketing/schedule", "shortDescription": {"text": "Unused endpoint: POST /api/marketing/schedule"}, "fullDescription": {"text": "`main.py` declares `POST /api/marketing/schedule` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d4e485040370fc37", "name": "Unused endpoint: GET /api/marketing/analytics", "shortDescription": {"text": "Unused endpoint: GET /api/marketing/analytics"}, "fullDescription": {"text": "`main.py` declares `GET /api/marketing/analytics` 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-5e815a40f4a7ef7b", "name": "Unused endpoint: GET /api/marketing/gcp-readiness", "shortDescription": {"text": "Unused endpoint: GET /api/marketing/gcp-readiness"}, "fullDescription": {"text": "`main.py` declares `GET /api/marketing/gcp-readiness` 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-cf395409f4887b01", "name": "Unused endpoint: GET /api/marketing/social-readiness", "shortDescription": {"text": "Unused endpoint: GET /api/marketing/social-readiness"}, "fullDescription": {"text": "`main.py` declares `GET /api/marketing/social-readiness` 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-db4001eceba73304", "name": "Unused endpoint: POST /api/marketing/generate-voiceover", "shortDescription": {"text": "Unused endpoint: POST /api/marketing/generate-voiceover"}, "fullDescription": {"text": "`main.py` declares `POST /api/marketing/generate-voiceover` 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-81dc8bb8345a5a44", "name": "Unused endpoint: GET /api/marketing/voiceover-voices", "shortDescription": {"text": "Unused endpoint: GET /api/marketing/voiceover-voices"}, "fullDescription": {"text": "`main.py` declares `GET /api/marketing/voiceover-voices` 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-447d8e4836274de1", "name": "Unused endpoint: POST /api/marketing/generate-image", "shortDescription": {"text": "Unused endpoint: POST /api/marketing/generate-image"}, "fullDescription": {"text": "`main.py` declares `POST /api/marketing/generate-image` 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-d5e0ea63a4280ba2", "name": "Unused endpoint: POST /api/marketing/generate-flyer", "shortDescription": {"text": "Unused endpoint: POST /api/marketing/generate-flyer"}, "fullDescription": {"text": "`main.py` declares `POST /api/marketing/generate-flyer` 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-d74e7f250a25b7fc", "name": "Unused endpoint: POST /api/marketing/generate-video", "shortDescription": {"text": "Unused endpoint: POST /api/marketing/generate-video"}, "fullDescription": {"text": "`main.py` declares `POST /api/marketing/generate-video` 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-5d2cf4bb90646de8", "name": "Unused endpoint: POST /api/marketing/generate-genai-clip", "shortDescription": {"text": "Unused endpoint: POST /api/marketing/generate-genai-clip"}, "fullDescription": {"text": "`main.py` declares `POST /api/marketing/generate-genai-clip` 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-674448b3bf243edb", "name": "Unused endpoint: GET /api/marketing/videos/{filename}", "shortDescription": {"text": "Unused endpoint: GET /api/marketing/videos/{filename}"}, "fullDescription": {"text": "`main.py` declares `GET /api/marketing/videos/{filename}` 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-2059d7d9e8abc912", "name": "Unused endpoint: GET /api/marketing/images/{filename}", "shortDescription": {"text": "Unused endpoint: GET /api/marketing/images/{filename}"}, "fullDescription": {"text": "`main.py` declares `GET /api/marketing/images/{filename}` 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-a673ce9cc46b2b41", "name": "Unused endpoint: GET /api/appointments/{appointment_id}", "shortDescription": {"text": "Unused endpoint: GET /api/appointments/{appointment_id}"}, "fullDescription": {"text": "`main.py` declares `GET /api/appointments/{appointment_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-bf0002e2506198ca", "name": "Unused endpoint: POST /api/appointments/{appointment_id}/cancel", "shortDescription": {"text": "Unused endpoint: POST /api/appointments/{appointment_id}/cancel"}, "fullDescription": {"text": "`main.py` declares `POST /api/appointments/{appointment_id}/cancel` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4f01423e4c38ed6", "name": "Unused endpoint: GET /api/leads", "shortDescription": {"text": "Unused endpoint: GET /api/leads"}, "fullDescription": {"text": "`main.py` declares `GET /api/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-47b728a699d75f29", "name": "Unused endpoint: GET /api/leads/{lead_id}", "shortDescription": {"text": "Unused endpoint: GET /api/leads/{lead_id}"}, "fullDescription": {"text": "`main.py` declares `GET /api/leads/{lead_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-da700024ae3164be", "name": "Unused endpoint: PUT /api/leads/{lead_id}", "shortDescription": {"text": "Unused endpoint: PUT /api/leads/{lead_id}"}, "fullDescription": {"text": "`main.py` declares `PUT /api/leads/{lead_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}}]}}, "automationDetails": {"id": "repobility/24296"}, "properties": {"repository": "arigatoexpress/Project-Go-Forward", "repoUrl": "https://github.com/arigatoexpress/Project-Go-Forward", "branch": "main"}, "results": [{"ruleId": "scanner-33d62581d080af9b", "level": "note", "message": {"text": "Possibly dead Python function: update_session_status"}, "properties": {"repobilityId": "f993e611a3fecef0", "scanner": "scanner-primary", "fingerprint": "33d62581d080af9b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "chat_history.py:188"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c5241e8529c1ca70", "level": "note", "message": {"text": "Possibly dead Python function: tool_call"}, "properties": {"repobilityId": "55b45a59dce3b36a", "scanner": "scanner-primary", "fingerprint": "c5241e8529c1ca70", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "structured_logging.py:81"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9ff54caec79e8df6", "level": "note", "message": {"text": "Possibly dead Python function: export_to_csv"}, "properties": {"repobilityId": "893f42bc20b50a40", "scanner": "scanner-primary", "fingerprint": "9ff54caec79e8df6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lead_management.py:138"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ba00e86d5e84b2be", "level": "note", "message": {"text": "Possibly dead Python function: capture_contact_info"}, "properties": {"repobilityId": "ab288253e9525e84", "scanner": "scanner-primary", "fingerprint": "ba00e86d5e84b2be", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lead_management.py:157"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ca279b39f5f2568a", "level": "note", "message": {"text": "Possibly dead Python function: require_admin"}, "properties": {"repobilityId": "3c06db2e25566bf7", "scanner": "scanner-primary", "fingerprint": "ca279b39f5f2568a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "main.py:814"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-055adfa9fba9b590", "level": "note", "message": {"text": "Possibly dead Python function: require_partner_api_key"}, "properties": {"repobilityId": "928bb7802e2bd2ce", "scanner": "scanner-primary", "fingerprint": "055adfa9fba9b590", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "main.py:5439"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-61e9cd4724cc09f7", "level": "note", "message": {"text": "Possibly dead Python function: maybe_trigger_automated_signing"}, "properties": {"repobilityId": "8db3aac27aa3d346", "scanner": "scanner-primary", "fingerprint": "61e9cd4724cc09f7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docuseal_service.py:222"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-45ce8fbbcb2a42df", "level": "note", "message": {"text": "Possibly dead Python function: business_email"}, "properties": {"repobilityId": "a510b29b20f95fa1", "scanner": "scanner-primary", "fingerprint": "45ce8fbbcb2a42df", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config_loader.py:70"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-164952c9903202e4", "level": "note", "message": {"text": "Possibly dead Python function: agent_name"}, "properties": {"repobilityId": "396191c6f0bfdc51", "scanner": "scanner-primary", "fingerprint": "164952c9903202e4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config_loader.py:101"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4eeaabfddfeb29cc", "level": "note", "message": {"text": "Possibly dead Python function: product_type"}, "properties": {"repobilityId": "493b8b3b2f319cf0", "scanner": "scanner-primary", "fingerprint": "4eeaabfddfeb29cc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config_loader.py:109"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-297758799834d7f2", "level": "note", "message": {"text": "Possibly dead Python function: cache_delete"}, "properties": {"repobilityId": "87e5e23cfb43476f", "scanner": "scanner-primary", "fingerprint": "297758799834d7f2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "caching.py:111"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4ffabcd58aa72676", "level": "note", "message": {"text": "Possibly dead Python function: probe"}, "properties": {"repobilityId": "90ebf24a9b031ee2", "scanner": "scanner-primary", "fingerprint": "4ffabcd58aa72676", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/probe_healthz.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0ce900efa8709e3c", "level": "note", "message": {"text": "Possibly dead Python function: check_manufacturer_cdn"}, "properties": {"repobilityId": "66dce4edcc20c379", "scanner": "scanner-primary", "fingerprint": "0ce900efa8709e3c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/inventory_picture_audit.py:186"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5e98b52549ca3019", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/firebase_import.js:35"}, "properties": {"repobilityId": "89e286a6eb758835", "scanner": "scanner-primary", "fingerprint": "5e98b52549ca3019", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a68c9df131648fb9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PropertyCard.jsx:273"}, "properties": {"repobilityId": "319741daf3b9822a", "scanner": "scanner-primary", "fingerprint": "a68c9df131648fb9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-500904fdd6d63650", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/ReportIssue.jsx:36"}, "properties": {"repobilityId": "71e4adaf717b9569", "scanner": "scanner-primary", "fingerprint": "500904fdd6d63650", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83552abcfe259d0a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SystemHub.jsx:139"}, "properties": {"repobilityId": "3ccf75e77c4b1cf6", "scanner": "scanner-primary", "fingerprint": "83552abcfe259d0a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0fe461d9e4695a50", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DocumentCenter.jsx:996"}, "properties": {"repobilityId": "d580c4a11198c0f3", "scanner": "scanner-primary", "fingerprint": "0fe461d9e4695a50", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7f43180bdda9ef5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/CRM.jsx:761"}, "properties": {"repobilityId": "47d6d25be0d37e3a", "scanner": "scanner-primary", "fingerprint": "d7f43180bdda9ef5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eecec6df1449548c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Analytics.jsx:492"}, "properties": {"repobilityId": "204a99373b77f22c", "scanner": "scanner-primary", "fingerprint": "eecec6df1449548c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42df0abfce3ad757", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SecureHub.jsx:185"}, "properties": {"repobilityId": "9d342619f25ba68a", "scanner": "scanner-primary", "fingerprint": "42df0abfce3ad757", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff93c30453722041", "level": "warning", "message": {"text": "Privileged port 12 in use"}, "properties": {"repobilityId": "65e7eefa33f2def4", "scanner": "scanner-primary", "fingerprint": "ff93c30453722041", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b71c2c2064cbe2a3", "level": "warning", "message": {"text": "Privileged port 18 in use"}, "properties": {"repobilityId": "2d7b5e7d9c158e43", "scanner": "scanner-primary", "fingerprint": "b71c2c2064cbe2a3", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-632854da18426b3e", "level": "warning", "message": {"text": "Privileged port 17 in use"}, "properties": {"repobilityId": "0bf38fb8f89ec589", "scanner": "scanner-primary", "fingerprint": "632854da18426b3e", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7de3a24cdbe4234e", "level": "warning", "message": {"text": "Privileged port 15 in use"}, "properties": {"repobilityId": "3340f9a170f285cd", "scanner": "scanner-primary", "fingerprint": "7de3a24cdbe4234e", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e066691601852931", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "16e99b92303c50d6", "scanner": "scanner-primary", "fingerprint": "e066691601852931", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-a35c6a00f751880f", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "properties": {"repobilityId": "875c35cc55c5f18f", "scanner": "scanner-primary", "fingerprint": "a35c6a00f751880f", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-e066691601852931", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "8323e536717a21f0", "scanner": "scanner-primary", "fingerprint": "e066691601852931", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-66071218eacac76c", "level": "warning", "message": {"text": "Dockerfile runs as root: services/docuseal/Dockerfile"}, "properties": {"repobilityId": "f80609d8735819a6", "scanner": "scanner-primary", "fingerprint": "66071218eacac76c", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-4a361e5f10a426d2", "level": "warning", "message": {"text": "Docker base image uses a mutable or implicit tag: docuseal/docuseal:latest"}, "properties": {"repobilityId": "4bcab5374cb0853a", "scanner": "scanner-primary", "fingerprint": "4a361e5f10a426d2", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/docuseal/Dockerfile"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-c57cdd0dcc05b624", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/App.jsx:339"}, "properties": {"repobilityId": "f19dc2fdf6ee3961", "scanner": "scanner-primary", "fingerprint": "c57cdd0dcc05b624", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/App.jsx"}, "region": {"startLine": 339}}}]}, {"ruleId": "scanner-1ea7635c309e2d44", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a84b72f707f2b54f", "scanner": "scanner-primary", "fingerprint": "1ea7635c309e2d44", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-docuseal.yml"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-1ea7635c309e2d44", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b17b3e8ff87411fc", "scanner": "scanner-primary", "fingerprint": "1ea7635c309e2d44", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-docuseal.yml"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-ebb8c5027c8752d3", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b3bf16ab1de8be07", "scanner": "scanner-primary", "fingerprint": "ebb8c5027c8752d3", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-docuseal.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2aca8efa8750fcc7", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "339ea91b96376696", "scanner": "scanner-primary", "fingerprint": "2aca8efa8750fcc7", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ops-bootstrap.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-2aca8efa8750fcc7", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "119fe1aac9c54dc2", "scanner": "scanner-primary", "fingerprint": "2aca8efa8750fcc7", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ops-bootstrap.yml"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-2d3cac716f974a3a", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b8a8fa545f0a6756", "scanner": "scanner-primary", "fingerprint": "2d3cac716f974a3a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ops-bootstrap.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "297c0e009a86c0cb", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bee6b8956e03198c", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "95ad281742fed1b8", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "14c837b0bbc02389", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "297c0e009a86c0cb", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8933a55d2b5015ad", "level": "note", "message": {"text": "Very large file: main.py (6158 lines)"}, "properties": {"repobilityId": "d28330f452f23706", "scanner": "scanner-primary", "fingerprint": "8933a55d2b5015ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-af7049ceb18fd06b", "level": "note", "message": {"text": "Very large file: tests/test_api_v1.py (2068 lines)"}, "properties": {"repobilityId": "e963854ce45fe50d", "scanner": "scanner-primary", "fingerprint": "af7049ceb18fd06b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cdd26bb77c3adc13", "level": "note", "message": {"text": "Very large file: tools/marketing_tools.py (2135 lines)"}, "properties": {"repobilityId": "977cacef410a3b9b", "scanner": "scanner-primary", "fingerprint": "cdd26bb77c3adc13", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9a32e14769da9876", "level": "note", "message": {"text": "Very large file: frontend/src/App.jsx (1489 lines)"}, "properties": {"repobilityId": "49d8e945ba36ff80", "scanner": "scanner-primary", "fingerprint": "9a32e14769da9876", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3e503035c6763f5e", "level": "note", "message": {"text": "Very large file: frontend/src/pages/DocumentCenter.jsx (3835 lines)"}, "properties": {"repobilityId": "b5827d70014f22db", "scanner": "scanner-primary", "fingerprint": "3e503035c6763f5e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b24dcf5294a7112a", "level": "note", "message": {"text": "Very large file: frontend/src/pages/CRM.jsx (1787 lines)"}, "properties": {"repobilityId": "224d188430325221", "scanner": "scanner-primary", "fingerprint": "b24dcf5294a7112a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b028a0d70833e8bd", "level": "note", "message": {"text": "Very large file: frontend/src/pages/AdStudio.jsx (2116 lines)"}, "properties": {"repobilityId": "c5e8f014c24d78f4", "scanner": "scanner-primary", "fingerprint": "b028a0d70833e8bd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bfb088597245fad5", "level": "note", "message": {"text": "Very large file: frontend/src/pages/InventoryBrowse.jsx (1747 lines)"}, "properties": {"repobilityId": "e3f29eebadd12c58", "scanner": "scanner-primary", "fingerprint": "bfb088597245fad5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "5ab8200704a5578e", "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": "8f6c6e7377681406", "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": "5687b59add41bb2f", "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": "300c787b3f744e73", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "b6bb4209f637a3d8", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-93cafdd22e9bc0d8", "level": "none", "message": {"text": "Commented-code block (8 lines) in seo_routes.py:117"}, "properties": {"repobilityId": "314449a9b4c960a9", "scanner": "scanner-primary", "fingerprint": "93cafdd22e9bc0d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b629709d93624c9", "level": "note", "message": {"text": "Legacy-named symbol `d_v1` in main.py:1307"}, "properties": {"repobilityId": "6e9e57a7ee54943e", "scanner": "scanner-primary", "fingerprint": "5b629709d93624c9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ca57f23b3b07fb83", "level": "none", "message": {"text": "Commented-code block (6 lines) in main.py:266"}, "properties": {"repobilityId": "e62011f5382492ab", "scanner": "scanner-primary", "fingerprint": "ca57f23b3b07fb83", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b90ff46dc7eacc17", "level": "none", "message": {"text": "Commented-code block (10 lines) in caching.py:7"}, "properties": {"repobilityId": "aae9aba2edfb148d", "scanner": "scanner-primary", "fingerprint": "b90ff46dc7eacc17", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fa038a6f370931d", "level": "note", "message": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_document_quality.py:4"}, "properties": {"repobilityId": "734149fc9d034c7d", "scanner": "scanner-primary", "fingerprint": "7fa038a6f370931d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-26f1b4925c36ed8c", "level": "note", "message": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_packet_no_blank_pages.py:28"}, "properties": {"repobilityId": "2e9dc62f08939bd6", "scanner": "scanner-primary", "fingerprint": "26f1b4925c36ed8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d88d3e3c78c0f151", "level": "note", "message": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_document_engine_v2.py:8"}, "properties": {"repobilityId": "d84a63de99f4a620", "scanner": "scanner-primary", "fingerprint": "d88d3e3c78c0f151", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bdd90965deed6000", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_feedback.py:9"}, "properties": {"repobilityId": "52278752822c21ac", "scanner": "scanner-primary", "fingerprint": "bdd90965deed6000", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c571b65ae387d4df", "level": "note", "message": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_document_fill_completeness.py:81"}, "properties": {"repobilityId": "fe3ff8175254f6c0", "scanner": "scanner-primary", "fingerprint": "c571b65ae387d4df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0374a0b1b2c65e78", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_inventory_validation.py:24"}, "properties": {"repobilityId": "653a71e9ee8335d0", "scanner": "scanner-primary", "fingerprint": "0374a0b1b2c65e78", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c621c254f4dd58d7", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_error_responses.py:24"}, "properties": {"repobilityId": "2371752db87c2d70", "scanner": "scanner-primary", "fingerprint": "c621c254f4dd58d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e3893a0c62bc6bf5", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_seo_routes.py:15"}, "properties": {"repobilityId": "efdae2125362a3be", "scanner": "scanner-primary", "fingerprint": "e3893a0c62bc6bf5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1e533f8c1b349bd6", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_healthz.py:8"}, "properties": {"repobilityId": "5b562bf26744dc19", "scanner": "scanner-primary", "fingerprint": "1e533f8c1b349bd6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5f3747bcc1300cf6", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_audit_log.py:24"}, "properties": {"repobilityId": "58ab467629178bbc", "scanner": "scanner-primary", "fingerprint": "5f3747bcc1300cf6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-886f9a84bef217f0", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_documents_share.py:25"}, "properties": {"repobilityId": "a5960048788b0c7a", "scanner": "scanner-primary", "fingerprint": "886f9a84bef217f0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1579dcf57d3c7cdd", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_deal_document_validation.py:217"}, "properties": {"repobilityId": "c92a6f79432d64e2", "scanner": "scanner-primary", "fingerprint": "1579dcf57d3c7cdd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-848a6a9727056729", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/test_deal_document_validation.py:229"}, "properties": {"repobilityId": "efb70b12a7558ffc", "scanner": "scanner-primary", "fingerprint": "848a6a9727056729", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e44cdaeeac8cd6d9", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_api_v1.py:3"}, "properties": {"repobilityId": "7e9b059e02eb5657", "scanner": "scanner-primary", "fingerprint": "e44cdaeeac8cd6d9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f028315da606c143", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/test_migration.py:17"}, "properties": {"repobilityId": "37cec01c73052968", "scanner": "scanner-primary", "fingerprint": "f028315da606c143", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a5dddd3d338ece9", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/test_inventory_tools_firestore.py:36"}, "properties": {"repobilityId": "c9e1a5d957e2df7d", "scanner": "scanner-primary", "fingerprint": "5a5dddd3d338ece9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1340e2adb5860b02", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_admin_auth.py:173"}, "properties": {"repobilityId": "8a368008cbe5d740", "scanner": "scanner-primary", "fingerprint": "1340e2adb5860b02", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6be6c42b75a48cf2", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_crm_tasks.py:14"}, "properties": {"repobilityId": "f23329b2c1518c16", "scanner": "scanner-primary", "fingerprint": "6be6c42b75a48cf2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c37e4e25634db617", "level": "note", "message": {"text": "Legacy-named symbol `test_api_v1` in tests/test_document_rag.py:4"}, "properties": {"repobilityId": "3e5de5d6fac30b58", "scanner": "scanner-primary", "fingerprint": "c37e4e25634db617", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4ff20b913d93332b", "level": "note", "message": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_seller_name_by_category.py:14"}, "properties": {"repobilityId": "0dff03aaf528c09a", "scanner": "scanner-primary", "fingerprint": "4ff20b913d93332b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-51333ce16123eb68", "level": "note", "message": {"text": "Legacy-named symbol `document_engine_v2` in tests/test_smoke_empty_deal.py:377"}, "properties": {"repobilityId": "702c2830be19a864", "scanner": "scanner-primary", "fingerprint": "51333ce16123eb68", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b13df45e5be2721f", "level": "note", "message": {"text": "Legacy-named symbol `document_engine_v2` in scripts/validate_document_fills.py:46"}, "properties": {"repobilityId": "ee99b5250929fde3", "scanner": "scanner-primary", "fingerprint": "b13df45e5be2721f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b86ee199eb226ff7", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/validate_document_fills.py:178"}, "properties": {"repobilityId": "54fa214a2e233a9e", "scanner": "scanner-primary", "fingerprint": "b86ee199eb226ff7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-960e6019daf074af", "level": "note", "message": {"text": "Stub function `cache_get` (body is just `pass`/`return`) \u2014 tools/inventory_tools.py:26"}, "properties": {"repobilityId": "74e4d966f554ddbc", "scanner": "scanner-primary", "fingerprint": "960e6019daf074af", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-1166b3d3a4cef91c", "level": "none", "message": {"text": "Commented-code block (7 lines) in tools/document_tools.py:568"}, "properties": {"repobilityId": "2e1da94c632b6854", "scanner": "scanner-primary", "fingerprint": "1166b3d3a4cef91c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a63a34a88f6a7523", "level": "note", "message": {"text": "Legacy-named symbol `unified_schema_v2` in tools/document_engine_v2.py:608"}, "properties": {"repobilityId": "1e5e3456da9557d6", "scanner": "scanner-primary", "fingerprint": "a63a34a88f6a7523", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-98a019d22ff0a504", "level": "note", "message": {"text": "Stub function `build` (body is just `pass`/`return`) \u2014 tools/drive_service.py:25"}, "properties": {"repobilityId": "4822b62bbb82dd85", "scanner": "scanner-primary", "fingerprint": "98a019d22ff0a504", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-f9064f89d5fc0af2", "level": "note", "message": {"text": "Legacy-named symbol `legacy_site_inventory_context_v2` in tools/legacy_site_crawler.py:50"}, "properties": {"repobilityId": "eb51f6a47f80d91d", "scanner": "scanner-primary", "fingerprint": "f9064f89d5fc0af2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fcae9197b7734a71", "level": "none", "message": {"text": "Commented-code block (5 lines) in tools/document_quality.py:15"}, "properties": {"repobilityId": "7c60d5f9c2a40ca3", "scanner": "scanner-primary", "fingerprint": "fcae9197b7734a71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-528193a969c9f651", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/App.jsx:340"}, "properties": {"repobilityId": "62fbf8696df61d37", "scanner": "scanner-primary", "fingerprint": "528193a969c9f651", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-db1a1744352ca2cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/PropertyCard.jsx:151"}, "properties": {"repobilityId": "c59994b81e7deea9", "scanner": "scanner-primary", "fingerprint": "db1a1744352ca2cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-711c748ade62475a", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/pages/DocumentCenter.jsx:73"}, "properties": {"repobilityId": "ebe487ae804bc059", "scanner": "scanner-primary", "fingerprint": "711c748ade62475a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34ca652d34860f2c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/InventoryBrowse.jsx:549"}, "properties": {"repobilityId": "a2314a87241d1fcb", "scanner": "scanner-primary", "fingerprint": "34ca652d34860f2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c9d02364e09e13c", "level": "note", "message": {"text": "55 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "fc70195b3e64b9a7", "scanner": "scanner-primary", "fingerprint": "0c9d02364e09e13c", "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": "ba372c393c58df39", "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": "005d0f3c1dec2708", "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": "f7066a7ca280aab8", "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": "09440158e155170b", "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": "75e32028fe0dd891", "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": "8a1d236f7c3e3aa2", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "47ae2913c4985b2f", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0e8ac838e34cd30b", "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": "d02491992eef1145", "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": "a5ed22a74769fc32", "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": "029713b4de9c82be", "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": "079fb87f64ef1b9e", "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": "49842f7a725cee61", "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": "ed40ca671b2961f8", "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": "efa3adcb6b11cc16", "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": "b8b1aabfd4fcbdaf", "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": "24fa0d97c5f44225", "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": "837f81f7a955068a", "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": "49b3a690223ce206", "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": "4e153250ffaa7cc5", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-5bd4654bc5027997", "level": "error", "message": {"text": "FastAPI POST `create_project` without auth dependency \u2014 pm_routes.py:37"}, "properties": {"repobilityId": "1f19cfa1fbaf5a57", "scanner": "scanner-primary", "fingerprint": "5bd4654bc5027997", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pm_routes.py"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-a3d33f96132c008f", "level": "error", "message": {"text": "FastAPI PATCH `update_project` without auth dependency \u2014 pm_routes.py:75"}, "properties": {"repobilityId": "7cd2842551730090", "scanner": "scanner-primary", "fingerprint": "a3d33f96132c008f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pm_routes.py"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-6d2faee22d1ac394", "level": "error", "message": {"text": "FastAPI POST `create_task` without auth dependency \u2014 pm_routes.py:96"}, "properties": {"repobilityId": "c99bf36ef0d6cbea", "scanner": "scanner-primary", "fingerprint": "6d2faee22d1ac394", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pm_routes.py"}, "region": {"startLine": 96}}}]}, {"ruleId": "scanner-aed8a3cf6c572d12", "level": "error", "message": {"text": "FastAPI PATCH `update_task` without auth dependency \u2014 pm_routes.py:157"}, "properties": {"repobilityId": "863cdbf2d11e75ad", "scanner": "scanner-primary", "fingerprint": "aed8a3cf6c572d12", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pm_routes.py"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-7ef403e53d45d08e", "level": "error", "message": {"text": "FastAPI POST `transition_task` without auth dependency \u2014 pm_routes.py:189"}, "properties": {"repobilityId": "8baa38f679f85679", "scanner": "scanner-primary", "fingerprint": "7ef403e53d45d08e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pm_routes.py"}, "region": {"startLine": 189}}}]}, {"ruleId": "scanner-0b2229845dd2ffcf", "level": "error", "message": {"text": "FastAPI POST `create_cycle` without auth dependency \u2014 pm_routes.py:223"}, "properties": {"repobilityId": "36cb67e7dbd95239", "scanner": "scanner-primary", "fingerprint": "0b2229845dd2ffcf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pm_routes.py"}, "region": {"startLine": 223}}}]}, {"ruleId": "scanner-2d88af8167d7d429", "level": "error", "message": {"text": "FastAPI POST `create_view` without auth dependency \u2014 pm_routes.py:283"}, "properties": {"repobilityId": "b1939c673d742b27", "scanner": "scanner-primary", "fingerprint": "2d88af8167d7d429", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pm_routes.py"}, "region": {"startLine": 283}}}]}, {"ruleId": "scanner-90c45c670fe686ad", "level": "error", "message": {"text": "FastAPI POST `import_github_issues` without auth dependency \u2014 pm_routes.py:353"}, "properties": {"repobilityId": "a1233ed00ba56b0e", "scanner": "scanner-primary", "fingerprint": "90c45c670fe686ad", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pm_routes.py"}, "region": {"startLine": 353}}}]}, {"ruleId": "scanner-616d589d67f214a7", "level": "error", "message": {"text": "FastAPI POST `passkey_logout` without auth dependency \u2014 auth/routes.py:676"}, "properties": {"repobilityId": "200efd4bf38eef15", "scanner": "scanner-primary", "fingerprint": "616d589d67f214a7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "auth/routes.py"}, "region": {"startLine": 676}}}]}, {"ruleId": "scanner-041340186832da9f", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/passkey/status (frontend/src/App.jsx:442)"}, "properties": {"repobilityId": "b9cded220ddd9c61", "scanner": "scanner-primary", "fingerprint": "041340186832da9f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c70a0442294c0c6", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/passkey/login/begin (frontend/src/App.jsx:468)"}, "properties": {"repobilityId": "25000ccf4f592e82", "scanner": "scanner-primary", "fingerprint": "0c70a0442294c0c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-51677ce411903e36", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/passkey/login/complete (frontend/src/App.jsx:495)"}, "properties": {"repobilityId": "6eab2a0b092c0a89", "scanner": "scanner-primary", "fingerprint": "51677ce411903e36", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-386c0aef27835fba", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/passkey/register/begin (frontend/src/App.jsx:541)"}, "properties": {"repobilityId": "8444a0f50c63f823", "scanner": "scanner-primary", "fingerprint": "386c0aef27835fba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5a2213e2291793b1", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/passkey/register/complete (frontend/src/App.jsx:572)"}, "properties": {"repobilityId": "caefd1c71842d72f", "scanner": "scanner-primary", "fingerprint": "5a2213e2291793b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e21e8945cc9890f4", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/passkey/status (frontend/src/pages/SystemHub.jsx:270)"}, "properties": {"repobilityId": "c3ee96e185e3a9e3", "scanner": "scanner-primary", "fingerprint": "e21e8945cc9890f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-69a693dfc33637f4", "level": "note", "message": {"text": "Unused endpoint: POST /run"}, "properties": {"repobilityId": "70fae7fb2506cf63", "scanner": "scanner-primary", "fingerprint": "69a693dfc33637f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ecc82226d4dc8f8", "level": "note", "message": {"text": "Unused endpoint: GET /leads/export"}, "properties": {"repobilityId": "f205cddfcd4ae5d7", "scanner": "scanner-primary", "fingerprint": "1ecc82226d4dc8f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5ffe7d39f9b8c78", "level": "note", "message": {"text": "Unused endpoint: GET /leads/stats"}, "properties": {"repobilityId": "1ca6e0a1fe982d36", "scanner": "scanner-primary", "fingerprint": "a5ffe7d39f9b8c78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-875ad1135b47d685", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/crm/lead-sources"}, "properties": {"repobilityId": "35cb09214be89661", "scanner": "scanner-primary", "fingerprint": "875ad1135b47d685", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-730a7ed99dc8f2d7", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/leads"}, "properties": {"repobilityId": "5496a767f873fdd1", "scanner": "scanner-primary", "fingerprint": "730a7ed99dc8f2d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7600880faa7ed4b", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/documents"}, "properties": {"repobilityId": "47d4a029ff600f60", "scanner": "scanner-primary", "fingerprint": "e7600880faa7ed4b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed0d74fd158e6b2b", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/inventory"}, "properties": {"repobilityId": "1b80af0fea588d17", "scanner": "scanner-primary", "fingerprint": "ed0d74fd158e6b2b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-40f1d06104882fce", "level": "note", "message": {"text": "Unused endpoint: GET /api/analytics/chat"}, "properties": {"repobilityId": "c92a12f8f03e3eec", "scanner": "scanner-primary", "fingerprint": "40f1d06104882fce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1abfb4ffbcb62ed", "level": "note", "message": {"text": "Unused endpoint: ANY /llms.txt"}, "properties": {"repobilityId": "594b87c32d6b3da1", "scanner": "scanner-primary", "fingerprint": "e1abfb4ffbcb62ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-000a90e8ffb2ba65", "level": "note", "message": {"text": "Unused endpoint: POST /apps/{app_name}/users/{user_id}/sessions/{session_id}"}, "properties": {"repobilityId": "b8f3be37769da2f6", "scanner": "scanner-primary", "fingerprint": "000a90e8ffb2ba65", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5e8c1b53e018fba", "level": "note", "message": {"text": "Unused endpoint: GET /api/documents/templates"}, "properties": {"repobilityId": "235325c957e27e6c", "scanner": "scanner-primary", "fingerprint": "a5e8c1b53e018fba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85cb92f3e704978c", "level": "note", "message": {"text": "Unused endpoint: GET /api/document-templates"}, "properties": {"repobilityId": "7145b7518d8f7e41", "scanner": "scanner-primary", "fingerprint": "85cb92f3e704978c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-218d2b9a26f37404", "level": "note", "message": {"text": "Unused endpoint: GET /api/documents/readiness"}, "properties": {"repobilityId": "d14fb0744d49ead2", "scanner": "scanner-primary", "fingerprint": "218d2b9a26f37404", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e830762dbdba1c0c", "level": "note", "message": {"text": "Unused endpoint: POST /api/documents/generate"}, "properties": {"repobilityId": "9a0cc3a1e655f6c4", "scanner": "scanner-primary", "fingerprint": "e830762dbdba1c0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f0a39ae9c1170447", "level": "note", "message": {"text": "Unused endpoint: POST /api/documents/generate-packet"}, "properties": {"repobilityId": "6f57986abf4aad3f", "scanner": "scanner-primary", "fingerprint": "f0a39ae9c1170447", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b53666d8f53f890e", "level": "note", "message": {"text": "Unused endpoint: GET /api/documents/fields"}, "properties": {"repobilityId": "658e59a3c4694a01", "scanner": "scanner-primary", "fingerprint": "b53666d8f53f890e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8aa0fc23ad61ca64", "level": "note", "message": {"text": "Unused endpoint: POST /api/documents/generate-batch"}, "properties": {"repobilityId": "88aa9bfbacbdad7a", "scanner": "scanner-primary", "fingerprint": "8aa0fc23ad61ca64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ed7a5a11cd4a03a", "level": "note", "message": {"text": "Unused endpoint: POST /api/documents/sales-contract"}, "properties": {"repobilityId": "e56e73b96547aadf", "scanner": "scanner-primary", "fingerprint": "9ed7a5a11cd4a03a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7545746ff77b48cd", "level": "note", "message": {"text": "Unused endpoint: GET /api/documents/download/{filename}"}, "properties": {"repobilityId": "6ce491f572ea4cf1", "scanner": "scanner-primary", "fingerprint": "7545746ff77b48cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d7a86a4aa518df0d", "level": "note", "message": {"text": "Unused endpoint: GET /api/inventory"}, "properties": {"repobilityId": "3029712d930924bd", "scanner": "scanner-primary", "fingerprint": "d7a86a4aa518df0d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-da200bab0f258534", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/inventory/photo-audit"}, "properties": {"repobilityId": "7dd1faea06086733", "scanner": "scanner-primary", "fingerprint": "da200bab0f258534", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b1d0ae7e1e53ae7", "level": "note", "message": {"text": "Unused endpoint: POST /api/inventory/bulk-import"}, "properties": {"repobilityId": "216c96f797cceda7", "scanner": "scanner-primary", "fingerprint": "1b1d0ae7e1e53ae7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-728472ea7896b76c", "level": "note", "message": {"text": "Unused endpoint: GET /api/deals"}, "properties": {"repobilityId": "44c9fd9518ee315a", "scanner": "scanner-primary", "fingerprint": "728472ea7896b76c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-034d42a6575c2724", "level": "note", "message": {"text": "Unused endpoint: POST /api/deals"}, "properties": {"repobilityId": "0ea328e86596693e", "scanner": "scanner-primary", "fingerprint": "034d42a6575c2724", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-236c7fdf89c4d855", "level": "note", "message": {"text": "Unused endpoint: GET /api/deals/{deal_id}"}, "properties": {"repobilityId": "a6fd3dfb9a38058c", "scanner": "scanner-primary", "fingerprint": "236c7fdf89c4d855", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad222d06f2f81188", "level": "note", "message": {"text": "Unused endpoint: PUT /api/deals/{deal_id}"}, "properties": {"repobilityId": "12a54bfa06f36d6b", "scanner": "scanner-primary", "fingerprint": "ad222d06f2f81188", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b7dd796394c7c18c", "level": "note", "message": {"text": "Unused endpoint: PUT /api/deals/{deal_id}/status"}, "properties": {"repobilityId": "07974e4baf924fe6", "scanner": "scanner-primary", "fingerprint": "b7dd796394c7c18c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff9ac1c8efa64d6d", "level": "note", "message": {"text": "Unused endpoint: POST /api/deals/{deal_id}/generate-document"}, "properties": {"repobilityId": "bd1091cd69f748a2", "scanner": "scanner-primary", "fingerprint": "ff9ac1c8efa64d6d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-691af80c6428b2f7", "level": "note", "message": {"text": "Unused endpoint: POST /api/deals/{deal_id}/generate-packet"}, "properties": {"repobilityId": "1c98ae006754d742", "scanner": "scanner-primary", "fingerprint": "691af80c6428b2f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5a50e3a432738f3", "level": "note", "message": {"text": "Unused endpoint: POST /api/docuseal/send"}, "properties": {"repobilityId": "7673e55420880591", "scanner": "scanner-primary", "fingerprint": "e5a50e3a432738f3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-908392af6281efa7", "level": "note", "message": {"text": "Unused endpoint: POST /api/docuseal/webhook"}, "properties": {"repobilityId": "5d30a6e089e1489d", "scanner": "scanner-primary", "fingerprint": "908392af6281efa7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0847d508d8dfeb03", "level": "note", "message": {"text": "Unused endpoint: POST /api/marketing/generate-script"}, "properties": {"repobilityId": "e29ad46cea960230", "scanner": "scanner-primary", "fingerprint": "0847d508d8dfeb03", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f4e9e900e0e839a", "level": "note", "message": {"text": "Unused endpoint: GET /api/marketing/trending-ideas"}, "properties": {"repobilityId": "de25a40df6897c62", "scanner": "scanner-primary", "fingerprint": "9f4e9e900e0e839a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-423fbc2f2b434c7e", "level": "note", "message": {"text": "Unused endpoint: POST /api/marketing/schedule"}, "properties": {"repobilityId": "ca5cfeec670959e1", "scanner": "scanner-primary", "fingerprint": "423fbc2f2b434c7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4e485040370fc37", "level": "note", "message": {"text": "Unused endpoint: GET /api/marketing/analytics"}, "properties": {"repobilityId": "518e8491b2cecc71", "scanner": "scanner-primary", "fingerprint": "d4e485040370fc37", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e815a40f4a7ef7b", "level": "note", "message": {"text": "Unused endpoint: GET /api/marketing/gcp-readiness"}, "properties": {"repobilityId": "47b37566c2f5142e", "scanner": "scanner-primary", "fingerprint": "5e815a40f4a7ef7b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cf395409f4887b01", "level": "note", "message": {"text": "Unused endpoint: GET /api/marketing/social-readiness"}, "properties": {"repobilityId": "f4f6026ba51ad13d", "scanner": "scanner-primary", "fingerprint": "cf395409f4887b01", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db4001eceba73304", "level": "note", "message": {"text": "Unused endpoint: POST /api/marketing/generate-voiceover"}, "properties": {"repobilityId": "49f0fa27a25d4d30", "scanner": "scanner-primary", "fingerprint": "db4001eceba73304", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81dc8bb8345a5a44", "level": "note", "message": {"text": "Unused endpoint: GET /api/marketing/voiceover-voices"}, "properties": {"repobilityId": "fa525191ebd3bcf1", "scanner": "scanner-primary", "fingerprint": "81dc8bb8345a5a44", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-447d8e4836274de1", "level": "note", "message": {"text": "Unused endpoint: POST /api/marketing/generate-image"}, "properties": {"repobilityId": "3e4ff10ddcd96fc7", "scanner": "scanner-primary", "fingerprint": "447d8e4836274de1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5e0ea63a4280ba2", "level": "note", "message": {"text": "Unused endpoint: POST /api/marketing/generate-flyer"}, "properties": {"repobilityId": "a06025f0ccf78d4c", "scanner": "scanner-primary", "fingerprint": "d5e0ea63a4280ba2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d74e7f250a25b7fc", "level": "note", "message": {"text": "Unused endpoint: POST /api/marketing/generate-video"}, "properties": {"repobilityId": "1d6140b02cf078e7", "scanner": "scanner-primary", "fingerprint": "d74e7f250a25b7fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5d2cf4bb90646de8", "level": "note", "message": {"text": "Unused endpoint: POST /api/marketing/generate-genai-clip"}, "properties": {"repobilityId": "0ef98edd010c9e12", "scanner": "scanner-primary", "fingerprint": "5d2cf4bb90646de8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-674448b3bf243edb", "level": "note", "message": {"text": "Unused endpoint: GET /api/marketing/videos/{filename}"}, "properties": {"repobilityId": "58553e5ca567a195", "scanner": "scanner-primary", "fingerprint": "674448b3bf243edb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2059d7d9e8abc912", "level": "note", "message": {"text": "Unused endpoint: GET /api/marketing/images/{filename}"}, "properties": {"repobilityId": "0279b48260529a8e", "scanner": "scanner-primary", "fingerprint": "2059d7d9e8abc912", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a673ce9cc46b2b41", "level": "note", "message": {"text": "Unused endpoint: GET /api/appointments/{appointment_id}"}, "properties": {"repobilityId": "045d23b3dc66494f", "scanner": "scanner-primary", "fingerprint": "a673ce9cc46b2b41", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf0002e2506198ca", "level": "note", "message": {"text": "Unused endpoint: POST /api/appointments/{appointment_id}/cancel"}, "properties": {"repobilityId": "98f9e302fb45fcd4", "scanner": "scanner-primary", "fingerprint": "bf0002e2506198ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4f01423e4c38ed6", "level": "note", "message": {"text": "Unused endpoint: GET /api/leads"}, "properties": {"repobilityId": "34dab0224f26a3f1", "scanner": "scanner-primary", "fingerprint": "b4f01423e4c38ed6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-47b728a699d75f29", "level": "note", "message": {"text": "Unused endpoint: GET /api/leads/{lead_id}"}, "properties": {"repobilityId": "666ef474ac0e5c5f", "scanner": "scanner-primary", "fingerprint": "47b728a699d75f29", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-da700024ae3164be", "level": "note", "message": {"text": "Unused endpoint: PUT /api/leads/{lead_id}"}, "properties": {"repobilityId": "e5c53d90aec97476", "scanner": "scanner-primary", "fingerprint": "da700024ae3164be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}