{"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-f71400749b1fc274", "name": "Possibly dead Python function: add_descriptor", "shortDescription": {"text": "Possibly dead Python function: add_descriptor"}, "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-599cbd7b192645b2", "name": "Possibly dead Python function: send_ready", "shortDescription": {"text": "Possibly dead Python function: send_ready"}, "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-317d5ef3b16c43ef", "name": "Possibly dead Python function: send_chunk", "shortDescription": {"text": "Possibly dead Python function: send_chunk"}, "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-c32921009a932031", "name": "Possibly dead Python function: do_configure", "shortDescription": {"text": "Possibly dead Python function: do_configure"}, "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-f01d0a353ef9462a", "name": "Possibly dead Python function: do_request", "shortDescription": {"text": "Possibly dead Python function: do_request"}, "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-9d4a480098219ed6", "name": "Possibly dead Python function: send_single", "shortDescription": {"text": "Possibly dead Python function: send_single"}, "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-c9400f968f2ce60d", "name": "Possibly dead Python function: register_ad_cb", "shortDescription": {"text": "Possibly dead Python function: register_ad_cb"}, "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-f0fbbb1e496d9917", "name": "Possibly dead Python function: register_ad_error_cb", "shortDescription": {"text": "Possibly dead Python function: register_ad_error_cb"}, "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-c37409d1b87f115a", "name": "Possibly dead Python function: register_app_cb", "shortDescription": {"text": "Possibly dead Python function: register_app_cb"}, "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-14d2a97b797fa51e", "name": "Possibly dead Python function: register_app_error_cb", "shortDescription": {"text": "Possibly dead Python function: register_app_error_cb"}, "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-06947ecb38997306", "name": "Possibly dead Python function: verify_gatt_objects", "shortDescription": {"text": "Possibly dead Python function: verify_gatt_objects"}, "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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-311fe69fd7eca932", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/CloudStatusBar.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/CloudStatusBar.tsx:166"}, "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-313a197696f87e96", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/upload/MultiFileUploader.tsx:348", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/upload/MultiFileUploader.tsx:348"}, "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-9e512034bc5fabf4", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/dashboard/CarStatusCard.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/dashboard/CarStatusCard.tsx:177"}, "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-b3b2a7fd92322c9b", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/setup/SetupProgress.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/setup/SetupProgress.tsx:250"}, "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-f694867e403426cb", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/setup/steps/WelcomeStep.tsx:645", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/setup/steps/WelcomeStep.tsx:645"}, "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-c2ab54a9c68bee77", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/charging/ChargingRatesButton.tsx:380", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/charging/ChargingRatesButton.tsx:380"}, "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-cb8a2b400f237549", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/charging/ChargingTagFilter.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/charging/ChargingTagFilter.tsx:85"}, "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-aa61af98778bbc8e", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Support.tsx:453", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Support.tsx:453"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7610fc18afecd8c4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 web/src/pages/Support.tsx:382", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web/src/pages/Support.tsx:382"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-84dfe6ec903fb567", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/LockChime.tsx:585", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/LockChime.tsx:585"}, "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-70372566c3adea78", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/CommunityWraps.tsx:373", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/CommunityWraps.tsx:373"}, "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-a4e91f1db7fa5ffd", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Snapshots.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Snapshots.tsx:224"}, "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-88de1e16646ce29c", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Charging.tsx:505", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Charging.tsx:505"}, "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-cba035bdf2d62a57", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Files.tsx:540", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Files.tsx:540"}, "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-d7bf9c74dfa15208", "name": "React Flow <MiniMap> without dark background \u2014 web/src/pages/Viewer.tsx:957", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 web/src/pages/Viewer.tsx:957"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a430d3dd0a679a5", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Viewer.tsx:757", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Viewer.tsx:757"}, "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-06457941e3121fdb", "name": "Possible secret in web/src/components/setup/steps/WelcomeStep.tsx", "shortDescription": {"text": "Possible secret in web/src/components/setup/steps/WelcomeStep.tsx"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-0380406d68ac247d", "name": "Insecure pattern 'dangerous_innerhtml' in web/src/pages/Support.tsx:382", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in web/src/pages/Support.tsx:382"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-20f43b8be1b4239c", "name": "Possible secret in setup/pi/configure.sh", "shortDescription": {"text": "Possible secret in setup/pi/configure.sh"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a1e6c351573749e", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "Andrew-Chen-Wang/github-wiki-action@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": "medium", "confidence": 1.0}}, {"id": "scanner-7c4be30924b0d0da", "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-8ecdc3efdd4aa236", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "contributor-assistant/github-action@v2.6.1 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-2fdcc3aac10df7e9", "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-6ba9bfab5f283202", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "dtolnay/rust-toolchain@stable 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-b769174c9fcf8ea8", "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-3837cd46d8c6ee31", "name": "Very large file: crates/tesla_telemetry/src/main.rs (1603 lines)", "shortDescription": {"text": "Very large file: crates/tesla_telemetry/src/main.rs (1603 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-d50584b97ec6e9b4", "name": "Very large file: crates/api/src/charging.rs (1359 lines)", "shortDescription": {"text": "Very large file: crates/api/src/charging.rs (1359 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-587aa44f930b88be", "name": "Very large file: crates/api/src/drives_handler.rs (1378 lines)", "shortDescription": {"text": "Very large file: crates/api/src/drives_handler.rs (1378 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-1795ce8f040c0f6a", "name": "Very large file: crates/drives/src/grouper.rs (3039 lines)", "shortDescription": {"text": "Very large file: crates/drives/src/grouper.rs (3039 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-754c742b0969e564", "name": "Very large file: crates/drives/src/json_compat.rs (1732 lines)", "shortDescription": {"text": "Very large file: crates/drives/src/json_compat.rs (1732 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-5adab5c9921caebd", "name": "Very large file: crates/drives/src/db.rs (3532 lines)", "shortDescription": {"text": "Very large file: crates/drives/src/db.rs (3532 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-60058c879261e5d9", "name": "Very large file: crates/drives/src/schema.rs (1252 lines)", "shortDescription": {"text": "Very large file: crates/drives/src/schema.rs (1252 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-54c70ff8621084ef", "name": "Very large file: crates/tesla_ble/src/manager.rs (1549 lines)", "shortDescription": {"text": "Very large file: crates/tesla_ble/src/manager.rs (1549 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-6f23eb83e051f10b", "name": "Very large file: web/src/pages/LockChime.tsx (1783 lines)", "shortDescription": {"text": "Very large file: web/src/pages/LockChime.tsx (1783 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-6bbff87271859477", "name": "Very large file: server/ble/sentryusb-ble.py (1558 lines)", "shortDescription": {"text": "Very large file: server/ble/sentryusb-ble.py (1558 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "2 test file(s) for 274 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 230 placeholder/mock markers across 39 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a8e2282fc701d28", "name": "Commented-code block (9 lines) in web/vite.config.ts:31", "shortDescription": {"text": "Commented-code block (9 lines) in web/vite.config.ts:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a87d779437e83494", "name": "Commented-code block (6 lines) in web/src/App.tsx:112", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/App.tsx:112"}, "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-b34055fcf5e843b1", "name": "Commented-code block (5 lines) in web/src/types/drives.ts:71", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/types/drives.ts:71"}, "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-dab078239ee27795", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api/tags.ts:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api/tags.ts:5"}, "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-7a04865229dd9997", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api/charging.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api/charging.ts:8"}, "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-5a57410005344622", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api/drives.ts:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api/drives.ts:4"}, "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-a1c7bb11d3bf5e74", "name": "Commented-code block (6 lines) in web/src/components/CloudPairingSection.tsx:118", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/components/CloudPairingSection.tsx:118"}, "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-814d2aa4578ade38", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/settings/sections/DisplayUnitsSection.tsx:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/settings/sections/DisplayUnitsSection.tsx:15"}, "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-5589e376750dfb1c", "name": "Legacy-named symbol `differsFromOld` in web/src/components/settings/sections/UpdateSection.tsx:257", "shortDescription": {"text": "Legacy-named symbol `differsFromOld` in web/src/components/settings/sections/UpdateSection.tsx:257"}, "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-ef99328ac87f01ad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/settings/sections/UpdateSection.tsx:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/settings/sections/UpdateSection.tsx:71"}, "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-39c17d008cecb4ed", "name": "Commented-code block (9 lines) in web/src/components/settings/sections/BlePairButton.tsx:262", "shortDescription": {"text": "Commented-code block (9 lines) in web/src/components/settings/sections/BlePairButton.tsx:262"}, "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-3ccb991c6068bc5b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/settings/sections/ConfigBackupSection.tsx:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/settings/sections/ConfigBackupSection.tsx:102"}, "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-5ee3c117e160e65f", "name": "Commented-code block (6 lines) in web/src/components/wraps/GodotRenderer.tsx:22", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/components/wraps/GodotRenderer.tsx:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-49ca831fe2d0aa8c", "name": "Commented-code block (5 lines) in web/src/components/dashboard/TirePressureCard.tsx:16", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/components/dashboard/TirePressureCard.tsx:16"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b5b0a685ce233265", "name": "Commented-code block (5 lines) in web/src/components/dashboard/CarStatusCard.tsx:126", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/components/dashboard/CarStatusCard.tsx:126"}, "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-415ae263edc34667", "name": "Commented-code block (5 lines) in web/src/components/setup/SetupWizard.tsx:41", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/components/setup/SetupWizard.tsx:41"}, "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-4be3b22052d8c8de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/setup/SetupWizard.tsx:581", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/setup/SetupWizard.tsx:581"}, "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-9e5cc3a9b4c3057a", "name": "Commented-code block (7 lines) in web/src/components/setup/SetupProgress.tsx:92", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/components/setup/SetupProgress.tsx:92"}, "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-305a33832aea9e33", "name": "Commented-code block (7 lines) in web/src/components/setup/steps/KeepAwakeStep.tsx:48", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/components/setup/steps/KeepAwakeStep.tsx:48"}, "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-64589dd903c9658e", "name": "Commented-code block (6 lines) in web/src/components/setup/steps/ArchiveStep.tsx:77", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/components/setup/steps/ArchiveStep.tsx:77"}, "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-4c6c53f7a101859a", "name": "Commented-code block (6 lines) in web/src/components/setup/steps/WelcomeStep.tsx:319", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/components/setup/steps/WelcomeStep.tsx:319"}, "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-d49e3504dfdb223d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/setup/steps/WelcomeStep.tsx:286", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/setup/steps/WelcomeStep.tsx:286"}, "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-1017a381548aaf63", "name": "Commented-code block (7 lines) in web/src/components/setup/steps/AdvancedStep.tsx:168", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/components/setup/steps/AdvancedStep.tsx:168"}, "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-51479e46992ae675", "name": "Commented-code block (6 lines) in web/src/components/charging/ChargingRatesButton.tsx:65", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/components/charging/ChargingRatesButton.tsx:65"}, "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-68a827200f70964d", "name": "Commented-code block (5 lines) in web/src/components/charging/ChargePowerChart.tsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/components/charging/ChargePowerChart.tsx:14"}, "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-54fa185cdac831aa", "name": "Commented-code block (5 lines) in web/src/components/charging/MiniPinMap.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/components/charging/MiniPinMap.tsx:5"}, "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-60dbbd95c0d1112a", "name": "Commented-code block (5 lines) in web/src/components/drives/DriveScrubber.tsx:30", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/components/drives/DriveScrubber.tsx:30"}, "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-42f42969dc2437f9", "name": "Commented-code block (7 lines) in web/src/components/drives/DriveMap.tsx:21", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/components/drives/DriveMap.tsx:21"}, "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-7a2e4008537c00b6", "name": "Commented-code block (5 lines) in web/src/components/drives/TemperatureChart.tsx:19", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/components/drives/TemperatureChart.tsx:19"}, "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-f601b5e27ded91dd", "name": "Commented-code block (6 lines) in web/src/components/drives/DriveChart.tsx:19", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/components/drives/DriveChart.tsx:19"}, "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-9405c4fb8ef55499", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/lib/api.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/lib/api.ts:9"}, "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-61e091f7a9fa8e58", "name": "Commented-code block (6 lines) in web/src/lib/drive-stats.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/lib/drive-stats.ts:8"}, "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-e89aa13fce6d8591", "name": "Commented-code block (6 lines) in web/src/lib/drive-format.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/lib/drive-format.ts:9"}, "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-415d1cb9857ecfcd", "name": "Commented-code block (5 lines) in web/src/pages/Drives.tsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/pages/Drives.tsx:14"}, "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-6abecf178ae6fc9b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Support.tsx:146", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Support.tsx:146"}, "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-729a2f5d2452fb95", "name": "Commented-code block (7 lines) in web/src/pages/ChargeSessionDetail.tsx:168", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/pages/ChargeSessionDetail.tsx:168"}, "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-899fc0b6ae3715a7", "name": "Commented-code block (5 lines) in web/src/pages/Dashboard.tsx:152", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/pages/Dashboard.tsx:152"}, "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-648026de8cb4b38c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Dashboard.tsx:224", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Dashboard.tsx:224"}, "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-4af9dd58922278ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/LockChime.tsx:1371", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/LockChime.tsx:1371"}, "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-34c22cfdc28ba76b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/CommunityWraps.tsx:190", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/CommunityWraps.tsx:190"}, "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-110d5a96ebb82fdf", "name": "Commented-code block (5 lines) in web/src/pages/Settings.tsx:19", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/pages/Settings.tsx:19"}, "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-ad0026df70598879", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Settings.tsx:151", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Settings.tsx:151"}, "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-1de687575c1cb064", "name": "Commented-code block (5 lines) in web/src/pages/Community.tsx:15", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/pages/Community.tsx: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-bd9e0dd001466b3b", "name": "Commented-code block (5 lines) in web/src/pages/Files.tsx:43", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/pages/Files.tsx:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30e98322016313c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Files.tsx:267", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Files.tsx:267"}, "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-e9ff8e67358928f1", "name": "Commented-code block (8 lines) in web/src/pages/Viewer.tsx:590", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/pages/Viewer.tsx:590"}, "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-11b8a132bd10378e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Viewer.tsx:234", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Viewer.tsx:234"}, "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-ae4f1b18cdf8433f", "name": "Commented-code block (7 lines) in web/src/pages/DriveDetail.tsx:109", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/pages/DriveDetail.tsx:109"}, "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-1366cc8c1bf3c549", "name": "Commented-code block (8 lines) in web/src/pages/Logs.tsx:351", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/pages/Logs.tsx:351"}, "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-ea16baaddb1e6c38", "name": "Commented-code block (7 lines) in web/src/pages/settings/SystemTab.tsx:35", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/pages/settings/SystemTab.tsx:35"}, "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-0ecb6ec155f1fbe3", "name": "Commented-code block (6 lines) in web/src/pages/settings/NetworkTab.tsx:25", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/pages/settings/NetworkTab.tsx:25"}, "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-bf48f3e64e6816a8", "name": "Commented-code block (5 lines) in web/src/hooks/useDrivesList.ts:241", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/hooks/useDrivesList.ts:241"}, "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-8e93db16e55cc9b1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/hooks/useKeepAccessory.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/hooks/useKeepAccessory.tsx:24"}, "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-11349480d440c466", "name": "Commented-code block (5 lines) in web/src/hooks/useDriveDetail.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/hooks/useDriveDetail.ts:13"}, "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-8bab63e9eb5acf93", "name": "Commented-code block (6 lines) in web/src/hooks/useScrubberSync.tsx:18", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/hooks/useScrubberSync.tsx:18"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c66864f2faeecb2", "name": "Commented-code block (6 lines) in web/src/hooks/useExperimental.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/hooks/useExperimental.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-479b8b2926b0f0ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/hooks/useExperimental.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/hooks/useExperimental.ts:18"}, "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-985bf1fb2cf2f7a8", "name": "Commented-code block (14 lines) in web/src/hooks/useChargingRates.ts:3", "shortDescription": {"text": "Commented-code block (14 lines) in web/src/hooks/useChargingRates.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47d7f3e64c780ab2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/hooks/useChargingRates.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/hooks/useChargingRates.ts:63"}, "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-0cc9ef744837df1d", "name": "Commented-code block (5 lines) in server/ble/sentryusb-ble.py:129", "shortDescription": {"text": "Commented-code block (5 lines) in server/ble/sentryusb-ble.py:129"}, "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-43f45e31b292ca2e", "name": "Stub function `WriteValue` (body is just `pass`/`return`) \u2014 server/ble/sentryusb-ble.py:624", "shortDescription": {"text": "Stub function `WriteValue` (body is just `pass`/`return`) \u2014 server/ble/sentryusb-ble.py:624"}, "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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nserver/ble/sentryusb-ble.py:get_path, server/ble/sentryusb-ble.py:get_path, server/ble/sentryusb-ble.py:get_path, server/ble/sentryusb-ble.py:get_path\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:\nserver/ble/sentryusb-ble.py:get_properties, server/ble/sentryusb-ble.py:get_properties, server/ble/sentryusb-ble.py:get_properties\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:\nserver/ble/sentryusb-ble.py:ReadValue, server/ble/sentryusb-ble.py:ReadValue, server/ble/sentryusb-ble.py:ReadValue, server/ble/sentryusb-ble.py:ReadValue\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nserver/ble/sentryusb-ble.py:send_chunk, server/ble/sentryusb-ble.py:send_chunk\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-46ba8da5c11326c1", "name": "Frontend route `/drives/:id` has no Link/navigate to it \u2014 web/src/App.tsx", "shortDescription": {"text": "Frontend route `/drives/:id` has no Link/navigate to it \u2014 web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3111ebeb30c2fa3c", "name": "Frontend route `/charging/:id` has no Link/navigate to it \u2014 web/src/App.tsx", "shortDescription": {"text": "Frontend route `/charging/:id` has no Link/navigate to it \u2014 web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4f3f3673079b948e", "name": "Frontend route `/preview/charging` has no Link/navigate to it \u2014 web/src/App.tsx", "shortDescription": {"text": "Frontend route `/preview/charging` has no Link/navigate to it \u2014 web/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19262"}, "properties": {"repository": "Sentry-Six/Sentry-USB-Rusty", "repoUrl": "https://github.com/Sentry-Six/Sentry-USB-Rusty", "branch": "main"}, "results": [{"ruleId": "scanner-f71400749b1fc274", "level": "note", "message": {"text": "Possibly dead Python function: add_descriptor"}, "properties": {"repobilityId": "f05a0d94e8d6de52", "scanner": "scanner-primary", "fingerprint": "f71400749b1fc274", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:604"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-599cbd7b192645b2", "level": "note", "message": {"text": "Possibly dead Python function: send_ready"}, "properties": {"repobilityId": "6e12d7cfd946fbfb", "scanner": "scanner-primary", "fingerprint": "599cbd7b192645b2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:753"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-317d5ef3b16c43ef", "level": "note", "message": {"text": "Possibly dead Python function: send_chunk"}, "properties": {"repobilityId": "c314b6deb9c9ab8b", "scanner": "scanner-primary", "fingerprint": "317d5ef3b16c43ef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:1055"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c32921009a932031", "level": "note", "message": {"text": "Possibly dead Python function: do_configure"}, "properties": {"repobilityId": "5c091a3ed08c4165", "scanner": "scanner-primary", "fingerprint": "c32921009a932031", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:837"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f01d0a353ef9462a", "level": "note", "message": {"text": "Possibly dead Python function: do_request"}, "properties": {"repobilityId": "f4787cc12d7ac1a1", "scanner": "scanner-primary", "fingerprint": "f01d0a353ef9462a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:1009"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9d4a480098219ed6", "level": "note", "message": {"text": "Possibly dead Python function: send_single"}, "properties": {"repobilityId": "e027ba8cdbab76eb", "scanner": "scanner-primary", "fingerprint": "9d4a480098219ed6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:1022"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c9400f968f2ce60d", "level": "note", "message": {"text": "Possibly dead Python function: register_ad_cb"}, "properties": {"repobilityId": "22e049345f72cc60", "scanner": "scanner-primary", "fingerprint": "c9400f968f2ce60d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:1283"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f0fbbb1e496d9917", "level": "note", "message": {"text": "Possibly dead Python function: register_ad_error_cb"}, "properties": {"repobilityId": "d5cdac362f119b5a", "scanner": "scanner-primary", "fingerprint": "f0fbbb1e496d9917", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:1286"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c37409d1b87f115a", "level": "note", "message": {"text": "Possibly dead Python function: register_app_cb"}, "properties": {"repobilityId": "410666e037323df1", "scanner": "scanner-primary", "fingerprint": "c37409d1b87f115a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:1290"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-14d2a97b797fa51e", "level": "note", "message": {"text": "Possibly dead Python function: register_app_error_cb"}, "properties": {"repobilityId": "c842ec4b9c825c99", "scanner": "scanner-primary", "fingerprint": "14d2a97b797fa51e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:1293"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-06947ecb38997306", "level": "note", "message": {"text": "Possibly dead Python function: verify_gatt_objects"}, "properties": {"repobilityId": "6be28e033d96539f", "scanner": "scanner-primary", "fingerprint": "06947ecb38997306", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/ble/sentryusb-ble.py:1298"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-311fe69fd7eca932", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/CloudStatusBar.tsx:166"}, "properties": {"repobilityId": "de2a521bd9cf4f06", "scanner": "scanner-primary", "fingerprint": "311fe69fd7eca932", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-313a197696f87e96", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/upload/MultiFileUploader.tsx:348"}, "properties": {"repobilityId": "d20b0a8664fae381", "scanner": "scanner-primary", "fingerprint": "313a197696f87e96", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e512034bc5fabf4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/dashboard/CarStatusCard.tsx:177"}, "properties": {"repobilityId": "df0f6b13ee5e14d0", "scanner": "scanner-primary", "fingerprint": "9e512034bc5fabf4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3b2a7fd92322c9b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/setup/SetupProgress.tsx:250"}, "properties": {"repobilityId": "1203f66195da2ed8", "scanner": "scanner-primary", "fingerprint": "b3b2a7fd92322c9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f694867e403426cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/setup/steps/WelcomeStep.tsx:645"}, "properties": {"repobilityId": "2c26f75d9647aa86", "scanner": "scanner-primary", "fingerprint": "f694867e403426cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2ab54a9c68bee77", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/charging/ChargingRatesButton.tsx:380"}, "properties": {"repobilityId": "fe42218e7a85965a", "scanner": "scanner-primary", "fingerprint": "c2ab54a9c68bee77", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb8a2b400f237549", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/components/charging/ChargingTagFilter.tsx:85"}, "properties": {"repobilityId": "aae7ce6cf1fc7835", "scanner": "scanner-primary", "fingerprint": "cb8a2b400f237549", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa61af98778bbc8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Support.tsx:453"}, "properties": {"repobilityId": "cdbf18db4deb9ea5", "scanner": "scanner-primary", "fingerprint": "aa61af98778bbc8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7610fc18afecd8c4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web/src/pages/Support.tsx:382"}, "properties": {"repobilityId": "77afd2254d68e7b7", "scanner": "scanner-primary", "fingerprint": "7610fc18afecd8c4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-84dfe6ec903fb567", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/LockChime.tsx:585"}, "properties": {"repobilityId": "d267c7e877bd348f", "scanner": "scanner-primary", "fingerprint": "84dfe6ec903fb567", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70372566c3adea78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/CommunityWraps.tsx:373"}, "properties": {"repobilityId": "bf92a840cd3ac148", "scanner": "scanner-primary", "fingerprint": "70372566c3adea78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4e91f1db7fa5ffd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Snapshots.tsx:224"}, "properties": {"repobilityId": "9ae88b1686bd7d7e", "scanner": "scanner-primary", "fingerprint": "a4e91f1db7fa5ffd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-88de1e16646ce29c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Charging.tsx:505"}, "properties": {"repobilityId": "fea341ed0986cdb0", "scanner": "scanner-primary", "fingerprint": "88de1e16646ce29c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cba035bdf2d62a57", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Files.tsx:540"}, "properties": {"repobilityId": "2cbb4b1251cbe5b4", "scanner": "scanner-primary", "fingerprint": "cba035bdf2d62a57", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7bf9c74dfa15208", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 web/src/pages/Viewer.tsx:957"}, "properties": {"repobilityId": "c7eea66067c856f6", "scanner": "scanner-primary", "fingerprint": "d7bf9c74dfa15208", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-2a430d3dd0a679a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/pages/Viewer.tsx:757"}, "properties": {"repobilityId": "18a9a326d22010be", "scanner": "scanner-primary", "fingerprint": "2a430d3dd0a679a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06457941e3121fdb", "level": "error", "message": {"text": "Possible secret in web/src/components/setup/steps/WelcomeStep.tsx"}, "properties": {"repobilityId": "b30bcd26e9097147", "scanner": "scanner-primary", "fingerprint": "06457941e3121fdb", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web/src/components/setup/steps/WelcomeStep.tsx"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-0380406d68ac247d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in web/src/pages/Support.tsx:382"}, "properties": {"repobilityId": "91e5a7c0dbab0f84", "scanner": "scanner-primary", "fingerprint": "0380406d68ac247d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web/src/pages/Support.tsx"}, "region": {"startLine": 382}}}]}, {"ruleId": "scanner-20f43b8be1b4239c", "level": "error", "message": {"text": "Possible secret in setup/pi/configure.sh"}, "properties": {"repobilityId": "2b8a728f8bd805f0", "scanner": "scanner-primary", "fingerprint": "20f43b8be1b4239c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "setup/pi/configure.sh"}, "region": {"startLine": 574}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-7a1e6c351573749e", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6410933167bdca08", "scanner": "scanner-primary", "fingerprint": "7a1e6c351573749e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/wiki-sync.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-7c4be30924b0d0da", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "f29703e785ac72af", "scanner": "scanner-primary", "fingerprint": "7c4be30924b0d0da", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/wiki-sync.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8ecdc3efdd4aa236", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6ad40a9f40f1f00f", "scanner": "scanner-primary", "fingerprint": "8ecdc3efdd4aa236", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cla.yml"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-2fdcc3aac10df7e9", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8790272a56f5e9ce", "scanner": "scanner-primary", "fingerprint": "2fdcc3aac10df7e9", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/cla.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6ba9bfab5f283202", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5d179015e79f173f", "scanner": "scanner-primary", "fingerprint": "6ba9bfab5f283202", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build.yml"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-6ba9bfab5f283202", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fb17820e3fa22314", "scanner": "scanner-primary", "fingerprint": "6ba9bfab5f283202", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build.yml"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-6ba9bfab5f283202", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fe3fa5e32991cba5", "scanner": "scanner-primary", "fingerprint": "6ba9bfab5f283202", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build.yml"}, "region": {"startLine": 187}}}]}, {"ruleId": "scanner-6ba9bfab5f283202", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b7d0896f775b62a6", "scanner": "scanner-primary", "fingerprint": "6ba9bfab5f283202", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build.yml"}, "region": {"startLine": 292}}}]}, {"ruleId": "scanner-6ba9bfab5f283202", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a9ccebf9e5a6f962", "scanner": "scanner-primary", "fingerprint": "6ba9bfab5f283202", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build.yml"}, "region": {"startLine": 309}}}]}, {"ruleId": "scanner-6ba9bfab5f283202", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b6a307be17f2d9e5", "scanner": "scanner-primary", "fingerprint": "6ba9bfab5f283202", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build.yml"}, "region": {"startLine": 337}}}]}, {"ruleId": "scanner-6ba9bfab5f283202", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c9f5a00ad6e50972", "scanner": "scanner-primary", "fingerprint": "6ba9bfab5f283202", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build.yml"}, "region": {"startLine": 346}}}]}, {"ruleId": "scanner-b769174c9fcf8ea8", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "e34b6cb9b56931d2", "scanner": "scanner-primary", "fingerprint": "b769174c9fcf8ea8", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/build.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3837cd46d8c6ee31", "level": "note", "message": {"text": "Very large file: crates/tesla_telemetry/src/main.rs (1603 lines)"}, "properties": {"repobilityId": "4b72db7d3cb3839e", "scanner": "scanner-primary", "fingerprint": "3837cd46d8c6ee31", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d50584b97ec6e9b4", "level": "note", "message": {"text": "Very large file: crates/api/src/charging.rs (1359 lines)"}, "properties": {"repobilityId": "db8063175b9c9af6", "scanner": "scanner-primary", "fingerprint": "d50584b97ec6e9b4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-587aa44f930b88be", "level": "note", "message": {"text": "Very large file: crates/api/src/drives_handler.rs (1378 lines)"}, "properties": {"repobilityId": "e6dc4d7c4923336c", "scanner": "scanner-primary", "fingerprint": "587aa44f930b88be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1795ce8f040c0f6a", "level": "note", "message": {"text": "Very large file: crates/drives/src/grouper.rs (3039 lines)"}, "properties": {"repobilityId": "1ef75933f63c8645", "scanner": "scanner-primary", "fingerprint": "1795ce8f040c0f6a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-754c742b0969e564", "level": "note", "message": {"text": "Very large file: crates/drives/src/json_compat.rs (1732 lines)"}, "properties": {"repobilityId": "437a566298fd9f2c", "scanner": "scanner-primary", "fingerprint": "754c742b0969e564", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5adab5c9921caebd", "level": "note", "message": {"text": "Very large file: crates/drives/src/db.rs (3532 lines)"}, "properties": {"repobilityId": "b6408840bd859ef6", "scanner": "scanner-primary", "fingerprint": "5adab5c9921caebd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-60058c879261e5d9", "level": "note", "message": {"text": "Very large file: crates/drives/src/schema.rs (1252 lines)"}, "properties": {"repobilityId": "d6d907fac88f5482", "scanner": "scanner-primary", "fingerprint": "60058c879261e5d9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-54c70ff8621084ef", "level": "note", "message": {"text": "Very large file: crates/tesla_ble/src/manager.rs (1549 lines)"}, "properties": {"repobilityId": "14727f99178c2659", "scanner": "scanner-primary", "fingerprint": "54c70ff8621084ef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6f23eb83e051f10b", "level": "note", "message": {"text": "Very large file: web/src/pages/LockChime.tsx (1783 lines)"}, "properties": {"repobilityId": "1fcec0f590a709fd", "scanner": "scanner-primary", "fingerprint": "6f23eb83e051f10b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6bbff87271859477", "level": "note", "message": {"text": "Very large file: server/ble/sentryusb-ble.py (1558 lines)"}, "properties": {"repobilityId": "ef5e99a7e581c619", "scanner": "scanner-primary", "fingerprint": "6bbff87271859477", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "158a56ce811f4b5c", "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": "800ccaceed52a561", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "8ac45a8a3d17c505", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "72cb403f8c1bfa38", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-1a8e2282fc701d28", "level": "none", "message": {"text": "Commented-code block (9 lines) in web/vite.config.ts:31"}, "properties": {"repobilityId": "083a6c7e69735048", "scanner": "scanner-primary", "fingerprint": "1a8e2282fc701d28", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a87d779437e83494", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/App.tsx:112"}, "properties": {"repobilityId": "7857b667c62964ee", "scanner": "scanner-primary", "fingerprint": "a87d779437e83494", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b34055fcf5e843b1", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/types/drives.ts:71"}, "properties": {"repobilityId": "b492cc075c7efaec", "scanner": "scanner-primary", "fingerprint": "b34055fcf5e843b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dab078239ee27795", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api/tags.ts:5"}, "properties": {"repobilityId": "09c58dc658ccfd8d", "scanner": "scanner-primary", "fingerprint": "dab078239ee27795", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a04865229dd9997", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api/charging.ts:8"}, "properties": {"repobilityId": "4b335c2ddd01e6b7", "scanner": "scanner-primary", "fingerprint": "7a04865229dd9997", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5a57410005344622", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api/drives.ts:4"}, "properties": {"repobilityId": "985bfdfa14cc4529", "scanner": "scanner-primary", "fingerprint": "5a57410005344622", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a1c7bb11d3bf5e74", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/components/CloudPairingSection.tsx:118"}, "properties": {"repobilityId": "963083c7ee279f79", "scanner": "scanner-primary", "fingerprint": "a1c7bb11d3bf5e74", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-814d2aa4578ade38", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/settings/sections/DisplayUnitsSection.tsx:15"}, "properties": {"repobilityId": "b1a863333e0792a0", "scanner": "scanner-primary", "fingerprint": "814d2aa4578ade38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5589e376750dfb1c", "level": "note", "message": {"text": "Legacy-named symbol `differsFromOld` in web/src/components/settings/sections/UpdateSection.tsx:257"}, "properties": {"repobilityId": "c1a02b6620d7d5a8", "scanner": "scanner-primary", "fingerprint": "5589e376750dfb1c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ef99328ac87f01ad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/settings/sections/UpdateSection.tsx:71"}, "properties": {"repobilityId": "ace18a914f615099", "scanner": "scanner-primary", "fingerprint": "ef99328ac87f01ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-39c17d008cecb4ed", "level": "none", "message": {"text": "Commented-code block (9 lines) in web/src/components/settings/sections/BlePairButton.tsx:262"}, "properties": {"repobilityId": "11dc043f0ed8ff81", "scanner": "scanner-primary", "fingerprint": "39c17d008cecb4ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ccb991c6068bc5b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/settings/sections/ConfigBackupSection.tsx:102"}, "properties": {"repobilityId": "1e3a96e63fbb022f", "scanner": "scanner-primary", "fingerprint": "3ccb991c6068bc5b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5ee3c117e160e65f", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/components/wraps/GodotRenderer.tsx:22"}, "properties": {"repobilityId": "02714f784bc07b45", "scanner": "scanner-primary", "fingerprint": "5ee3c117e160e65f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49ca831fe2d0aa8c", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/components/dashboard/TirePressureCard.tsx:16"}, "properties": {"repobilityId": "ce06d5a4e336dec8", "scanner": "scanner-primary", "fingerprint": "49ca831fe2d0aa8c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5b0a685ce233265", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/components/dashboard/CarStatusCard.tsx:126"}, "properties": {"repobilityId": "11ca7a6e3760252d", "scanner": "scanner-primary", "fingerprint": "b5b0a685ce233265", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-415ae263edc34667", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/components/setup/SetupWizard.tsx:41"}, "properties": {"repobilityId": "4ab298ba2297e2df", "scanner": "scanner-primary", "fingerprint": "415ae263edc34667", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4be3b22052d8c8de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/setup/SetupWizard.tsx:581"}, "properties": {"repobilityId": "0e772ae0bddaca43", "scanner": "scanner-primary", "fingerprint": "4be3b22052d8c8de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e5cc3a9b4c3057a", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/components/setup/SetupProgress.tsx:92"}, "properties": {"repobilityId": "8ed6a9dc602258fe", "scanner": "scanner-primary", "fingerprint": "9e5cc3a9b4c3057a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-305a33832aea9e33", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/components/setup/steps/KeepAwakeStep.tsx:48"}, "properties": {"repobilityId": "d937d0e004c2a506", "scanner": "scanner-primary", "fingerprint": "305a33832aea9e33", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64589dd903c9658e", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/components/setup/steps/ArchiveStep.tsx:77"}, "properties": {"repobilityId": "0077a6de6d418ac1", "scanner": "scanner-primary", "fingerprint": "64589dd903c9658e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c6c53f7a101859a", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/components/setup/steps/WelcomeStep.tsx:319"}, "properties": {"repobilityId": "e026bd715859dc37", "scanner": "scanner-primary", "fingerprint": "4c6c53f7a101859a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d49e3504dfdb223d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/components/setup/steps/WelcomeStep.tsx:286"}, "properties": {"repobilityId": "76744eb70287a6d8", "scanner": "scanner-primary", "fingerprint": "d49e3504dfdb223d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1017a381548aaf63", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/components/setup/steps/AdvancedStep.tsx:168"}, "properties": {"repobilityId": "55ff8f5134c52b34", "scanner": "scanner-primary", "fingerprint": "1017a381548aaf63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51479e46992ae675", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/components/charging/ChargingRatesButton.tsx:65"}, "properties": {"repobilityId": "fb9b1bef1af205e1", "scanner": "scanner-primary", "fingerprint": "51479e46992ae675", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68a827200f70964d", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/components/charging/ChargePowerChart.tsx:14"}, "properties": {"repobilityId": "eb5ac9aaef0ac6d0", "scanner": "scanner-primary", "fingerprint": "68a827200f70964d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54fa185cdac831aa", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/components/charging/MiniPinMap.tsx:5"}, "properties": {"repobilityId": "f64411083d5fd56e", "scanner": "scanner-primary", "fingerprint": "54fa185cdac831aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60dbbd95c0d1112a", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/components/drives/DriveScrubber.tsx:30"}, "properties": {"repobilityId": "6f06295bacb3ec50", "scanner": "scanner-primary", "fingerprint": "60dbbd95c0d1112a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42f42969dc2437f9", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/components/drives/DriveMap.tsx:21"}, "properties": {"repobilityId": "778fddd6f7f9229d", "scanner": "scanner-primary", "fingerprint": "42f42969dc2437f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a2e4008537c00b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/components/drives/TemperatureChart.tsx:19"}, "properties": {"repobilityId": "09221222b9ff650e", "scanner": "scanner-primary", "fingerprint": "7a2e4008537c00b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f601b5e27ded91dd", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/components/drives/DriveChart.tsx:19"}, "properties": {"repobilityId": "3112aa1b005407af", "scanner": "scanner-primary", "fingerprint": "f601b5e27ded91dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9405c4fb8ef55499", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/lib/api.ts:9"}, "properties": {"repobilityId": "a3b4a0d36c87c644", "scanner": "scanner-primary", "fingerprint": "9405c4fb8ef55499", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-61e091f7a9fa8e58", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/lib/drive-stats.ts:8"}, "properties": {"repobilityId": "848bf0e0f135c41b", "scanner": "scanner-primary", "fingerprint": "61e091f7a9fa8e58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e89aa13fce6d8591", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/lib/drive-format.ts:9"}, "properties": {"repobilityId": "c68056335826942b", "scanner": "scanner-primary", "fingerprint": "e89aa13fce6d8591", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-415d1cb9857ecfcd", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/pages/Drives.tsx:14"}, "properties": {"repobilityId": "848460081873db76", "scanner": "scanner-primary", "fingerprint": "415d1cb9857ecfcd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6abecf178ae6fc9b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Support.tsx:146"}, "properties": {"repobilityId": "9f04b3ce6a70a5c0", "scanner": "scanner-primary", "fingerprint": "6abecf178ae6fc9b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-729a2f5d2452fb95", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/pages/ChargeSessionDetail.tsx:168"}, "properties": {"repobilityId": "91b385e4b9136ba2", "scanner": "scanner-primary", "fingerprint": "729a2f5d2452fb95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-899fc0b6ae3715a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/pages/Dashboard.tsx:152"}, "properties": {"repobilityId": "296e688d4c5d2c90", "scanner": "scanner-primary", "fingerprint": "899fc0b6ae3715a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-648026de8cb4b38c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Dashboard.tsx:224"}, "properties": {"repobilityId": "47475ffa5774aafb", "scanner": "scanner-primary", "fingerprint": "648026de8cb4b38c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4af9dd58922278ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/LockChime.tsx:1371"}, "properties": {"repobilityId": "77cc9683c8a1529f", "scanner": "scanner-primary", "fingerprint": "4af9dd58922278ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-34c22cfdc28ba76b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/CommunityWraps.tsx:190"}, "properties": {"repobilityId": "6202f3070652f253", "scanner": "scanner-primary", "fingerprint": "34c22cfdc28ba76b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-110d5a96ebb82fdf", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/pages/Settings.tsx:19"}, "properties": {"repobilityId": "7a72d7c97b10163f", "scanner": "scanner-primary", "fingerprint": "110d5a96ebb82fdf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad0026df70598879", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Settings.tsx:151"}, "properties": {"repobilityId": "f0891cd39d22cb30", "scanner": "scanner-primary", "fingerprint": "ad0026df70598879", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1de687575c1cb064", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/pages/Community.tsx:15"}, "properties": {"repobilityId": "b2ed6b9c0d035c42", "scanner": "scanner-primary", "fingerprint": "1de687575c1cb064", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd9e0dd001466b3b", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/pages/Files.tsx:43"}, "properties": {"repobilityId": "860ee869621e784d", "scanner": "scanner-primary", "fingerprint": "bd9e0dd001466b3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30e98322016313c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Files.tsx:267"}, "properties": {"repobilityId": "2ed9e6b3e5d7308a", "scanner": "scanner-primary", "fingerprint": "30e98322016313c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9ff8e67358928f1", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/pages/Viewer.tsx:590"}, "properties": {"repobilityId": "ee34455cdcd10806", "scanner": "scanner-primary", "fingerprint": "e9ff8e67358928f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11b8a132bd10378e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/pages/Viewer.tsx:234"}, "properties": {"repobilityId": "80ef7a2cd73aea76", "scanner": "scanner-primary", "fingerprint": "11b8a132bd10378e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae4f1b18cdf8433f", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/pages/DriveDetail.tsx:109"}, "properties": {"repobilityId": "1d5acb126f24e3cf", "scanner": "scanner-primary", "fingerprint": "ae4f1b18cdf8433f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1366cc8c1bf3c549", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/pages/Logs.tsx:351"}, "properties": {"repobilityId": "b6171231d6ae5cf6", "scanner": "scanner-primary", "fingerprint": "1366cc8c1bf3c549", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea16baaddb1e6c38", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/pages/settings/SystemTab.tsx:35"}, "properties": {"repobilityId": "9c8d4506a9915b0c", "scanner": "scanner-primary", "fingerprint": "ea16baaddb1e6c38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ecb6ec155f1fbe3", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/pages/settings/NetworkTab.tsx:25"}, "properties": {"repobilityId": "888d21a2a32f808c", "scanner": "scanner-primary", "fingerprint": "0ecb6ec155f1fbe3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf48f3e64e6816a8", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/hooks/useDrivesList.ts:241"}, "properties": {"repobilityId": "c2b234eccc2a9143", "scanner": "scanner-primary", "fingerprint": "bf48f3e64e6816a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e93db16e55cc9b1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/hooks/useKeepAccessory.tsx:24"}, "properties": {"repobilityId": "9c3a164a93a87145", "scanner": "scanner-primary", "fingerprint": "8e93db16e55cc9b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-11349480d440c466", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/hooks/useDriveDetail.ts:13"}, "properties": {"repobilityId": "90a921a69527deef", "scanner": "scanner-primary", "fingerprint": "11349480d440c466", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8bab63e9eb5acf93", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/hooks/useScrubberSync.tsx:18"}, "properties": {"repobilityId": "f4219285dd09e738", "scanner": "scanner-primary", "fingerprint": "8bab63e9eb5acf93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c66864f2faeecb2", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/hooks/useExperimental.ts:3"}, "properties": {"repobilityId": "b5b81ecc4d0408e1", "scanner": "scanner-primary", "fingerprint": "6c66864f2faeecb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-479b8b2926b0f0ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/hooks/useExperimental.ts:18"}, "properties": {"repobilityId": "362ddfc1f9e94efa", "scanner": "scanner-primary", "fingerprint": "479b8b2926b0f0ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-985bf1fb2cf2f7a8", "level": "none", "message": {"text": "Commented-code block (14 lines) in web/src/hooks/useChargingRates.ts:3"}, "properties": {"repobilityId": "4af16230b6a3fbc0", "scanner": "scanner-primary", "fingerprint": "985bf1fb2cf2f7a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47d7f3e64c780ab2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/hooks/useChargingRates.ts:63"}, "properties": {"repobilityId": "036926fdbaf82a59", "scanner": "scanner-primary", "fingerprint": "47d7f3e64c780ab2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0cc9ef744837df1d", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/ble/sentryusb-ble.py:129"}, "properties": {"repobilityId": "1207473522b23d71", "scanner": "scanner-primary", "fingerprint": "0cc9ef744837df1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-43f45e31b292ca2e", "level": "note", "message": {"text": "Stub function `WriteValue` (body is just `pass`/`return`) \u2014 server/ble/sentryusb-ble.py:624"}, "properties": {"repobilityId": "ccce316642975363", "scanner": "scanner-primary", "fingerprint": "43f45e31b292ca2e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "63168ddf65f1e368", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a9c22edeaa7572e3", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "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": "b048147de5e706be", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "f7afcb93b6436c44", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "0a92120094e68ce3", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f8fb66ffca7e49cb", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-46ba8da5c11326c1", "level": "warning", "message": {"text": "Frontend route `/drives/:id` has no Link/navigate to it \u2014 web/src/App.tsx"}, "properties": {"repobilityId": "3332a6e044555a83", "scanner": "scanner-primary", "fingerprint": "46ba8da5c11326c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3111ebeb30c2fa3c", "level": "warning", "message": {"text": "Frontend route `/charging/:id` has no Link/navigate to it \u2014 web/src/App.tsx"}, "properties": {"repobilityId": "0eb5c8301022b71c", "scanner": "scanner-primary", "fingerprint": "3111ebeb30c2fa3c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4f3f3673079b948e", "level": "warning", "message": {"text": "Frontend route `/preview/charging` has no Link/navigate to it \u2014 web/src/App.tsx"}, "properties": {"repobilityId": "9caf5601a303ce3c", "scanner": "scanner-primary", "fingerprint": "4f3f3673079b948e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}