{"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-337714d062891481", "name": "`truncate` class without `title=` for hover reveal \u2014 examples/demo/src/BugReportsDemo.tsx:45", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 examples/demo/src/BugReportsDemo.tsx:45"}, "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-5f376b572f766d73", "name": "`truncate` class without `title=` for hover reveal \u2014 examples/demo/src/TableDemo.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 examples/demo/src/TableDemo.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-9ce04a8ca058aa09", "name": "`truncate` class without `title=` for hover reveal \u2014 src/apps/WorldClock.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/WorldClock.tsx:134"}, "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-0de4a6e743d014b9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Preview.tsx:373", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Preview.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-2365e61155774671", "name": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Notepad.tsx:347", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Notepad.tsx:347"}, "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-206c5ae16d0697b9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Calculator.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Calculator.tsx:135"}, "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-1c71ee89d15122e7", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/apps/Documents.tsx:344", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/apps/Documents.tsx:344"}, "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-b28a29cc0d16560f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Weather.tsx:344", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Weather.tsx:344"}, "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-02c06f716a1e5c2f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Files.tsx:555", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Files.tsx:555"}, "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-6d5d6cd1c947f3f0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/WidgetManager.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/WidgetManager.tsx:214"}, "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-e1d52f7995de9330", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/WindowManager.tsx:377", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/WindowManager.tsx:377"}, "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-23c8e2d8cf5b8ccf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/MobileProfileSheet.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/MobileProfileSheet.tsx:52"}, "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-58b86f1e22994082", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/GlobalSearch.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/GlobalSearch.tsx:142"}, "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-74894e152301ec2e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Breadcrumbs.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Breadcrumbs.tsx:80"}, "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-1671e0a45cc2da9d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Modal.tsx:1720", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Modal.tsx:1720"}, "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-9eec4249646ca533", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/NotificationBell.tsx:228", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/NotificationBell.tsx:228"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-004cddb44ceeaa1a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Layout.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Layout.tsx:153"}, "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-ba98e7bafc9c5e70", "name": "\"active\" state uses light bg in a dark theme \u2014 src/shell/Layout.tsx:527", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/shell/Layout.tsx:527"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-45922c695f7974d8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Sidebar.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Sidebar.tsx:175"}, "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-f33eec95e374b932", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/MobileSwitcher.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/MobileSwitcher.tsx:60"}, "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-53143467a94e2f22", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/shell/EditableGrid.tsx:786", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/shell/EditableGrid.tsx:786"}, "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-fb05f512d53905b4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/StartMenu.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/StartMenu.tsx:194"}, "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-fa716ea4cf33b0ed", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/HelpCenter.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/HelpCenter.tsx:190"}, "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-012dae85a3ff0320", "name": "`truncate` class without `title=` for hover reveal \u2014 src/shell/MobileHome.tsx:334", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/MobileHome.tsx:334"}, "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-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-835eae4c7f17a2f8", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8a9dad282208fbdd", "name": "Insecure pattern 'document_write' in src/apps/Preview.tsx:576", "shortDescription": {"text": "Insecure pattern 'document_write' in src/apps/Preview.tsx:576"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d58806b249137e83", "name": "Insecure pattern 'exec_used' in src/apps/Documents.tsx:248", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/apps/Documents.tsx:248"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c1c62134f757fe3e", "name": "Insecure pattern 'dangerous_innerhtml' in src/apps/Documents.tsx:344", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/apps/Documents.tsx:344"}, "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-f48550d44611d2d4", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/shell/WindowManager.tsx:356", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/shell/WindowManager.tsx:356"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fca1c2a62e4126e1", "name": "Insecure pattern 'dangerous_innerhtml' in src/shell/EditableGrid.tsx:786", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/shell/EditableGrid.tsx:786"}, "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-9729bcdaead87088", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/shell/toast.ts:78", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/shell/toast.ts:78"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4f658c0c00de0d4", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/deploy-pages@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-448d8837178ae57a", "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-98354498558aea85", "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-5c02b180c301e28c", "name": "Very large file: src/apps/Preview.tsx (4121 lines)", "shortDescription": {"text": "Very large file: src/apps/Preview.tsx (4121 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-4f7f5575a015504d", "name": "Very large file: src/shell/Modal.tsx (1970 lines)", "shortDescription": {"text": "Very large file: src/shell/Modal.tsx (1970 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-ad010330ece20231", "name": "Very large file: src/shell/Layout.tsx (1126 lines)", "shortDescription": {"text": "Very large file: src/shell/Layout.tsx (1126 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-6613edc8d0ad3490", "name": "Very large file: src/shell/Desktop.tsx (1369 lines)", "shortDescription": {"text": "Very large file: src/shell/Desktop.tsx (1369 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 117 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c8280b913bfa8147", "name": "Node manifest has dependencies but no lockfile: examples/file-server/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: examples/file-server/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 5 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 64 placeholder/mock markers across 25 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: tests, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing tests, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2885bd9eed901cd", "name": "Commented-code block (6 lines) in examples/file-server/server.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in examples/file-server/server.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-990abd7a12a551ae", "name": "Commented-code block (6 lines) in src/settings/Customization.tsx:61", "shortDescription": {"text": "Commented-code block (6 lines) in src/settings/Customization.tsx:61"}, "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-fc29f958bbc6894e", "name": "Commented-code block (7 lines) in src/apps/Preview.tsx:127", "shortDescription": {"text": "Commented-code block (7 lines) in src/apps/Preview.tsx:127"}, "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-fafc41accef5a12c", "name": "Commented-code block (5 lines) in src/apps/PomodoroTimer.tsx:148", "shortDescription": {"text": "Commented-code block (5 lines) in src/apps/PomodoroTimer.tsx:148"}, "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-e3191ad06f6a5d12", "name": "Commented-code block (7 lines) in src/apps/Spreadsheet.tsx:124", "shortDescription": {"text": "Commented-code block (7 lines) in src/apps/Spreadsheet.tsx:124"}, "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-4ddb6206bc299b13", "name": "Commented-code block (5 lines) in src/apps/Browser.tsx:95", "shortDescription": {"text": "Commented-code block (5 lines) in src/apps/Browser.tsx:95"}, "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-d0019ce5a8d60dd9", "name": "Commented-code block (7 lines) in src/shell/WidgetManager.tsx:114", "shortDescription": {"text": "Commented-code block (7 lines) in src/shell/WidgetManager.tsx:114"}, "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-0d33333d3ded48a0", "name": "Commented-code block (6 lines) in src/shell/desktopIcons.tsx:195", "shortDescription": {"text": "Commented-code block (6 lines) in src/shell/desktopIcons.tsx:195"}, "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-81da31fde7780ed5", "name": "Commented-code block (6 lines) in src/shell/BugReportDialog.tsx:144", "shortDescription": {"text": "Commented-code block (6 lines) in src/shell/BugReportDialog.tsx:144"}, "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-4f7f79d0760d9899", "name": "Commented-code block (6 lines) in src/shell/LogoutAnimation.tsx:5", "shortDescription": {"text": "Commented-code block (6 lines) in src/shell/LogoutAnimation.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-7b8e81153be534d8", "name": "Commented-code block (8 lines) in src/shell/Modal.tsx:333", "shortDescription": {"text": "Commented-code block (8 lines) in src/shell/Modal.tsx:333"}, "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-755144675cfa5eb3", "name": "Commented-code block (5 lines) in src/shell/Layout.tsx:778", "shortDescription": {"text": "Commented-code block (5 lines) in src/shell/Layout.tsx:778"}, "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-95bfcf33db1d9a83", "name": "Commented-code block (9 lines) in src/shell/StartMenu.tsx:68", "shortDescription": {"text": "Commented-code block (9 lines) in src/shell/StartMenu.tsx:68"}, "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-51fc68eff7978793", "name": "Commented-code block (7 lines) in src/shell/Desktop.tsx:50", "shortDescription": {"text": "Commented-code block (7 lines) in src/shell/Desktop.tsx:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8bdb9b38a43a4ce7", "name": "Commented-code block (6 lines) in src/shell/pomodoroStore.ts:196", "shortDescription": {"text": "Commented-code block (6 lines) in src/shell/pomodoroStore.ts:196"}, "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-7502ee7adc9807da", "name": "Dangling fetch: GET https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}&current=temper", "shortDescription": {"text": "Dangling fetch: GET https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}&current=temperature_2m,weather_code,is_day&daily=temperature_2m_max,temperature_2m_min&forecast_days=1&timezone=auto (src/apps/_weathe"}, "fullDescription": {"text": "`src/apps/_weatherData.ts:92` calls `GET https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}&current=temperature_2m,weather_code,is_day&daily=temperature_2m_max,temperature_2m_min&forecast_days=1&timezone=auto` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.open-meteo.com/v1/forecast`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3bef096a4f352571", "name": "Dangling fetch: GET https://open.er-api.com/v6/latest/${base} (src/apps/CurrencyConverter.tsx:71)", "shortDescription": {"text": "Dangling fetch: GET https://open.er-api.com/v6/latest/${base} (src/apps/CurrencyConverter.tsx:71)"}, "fullDescription": {"text": "`src/apps/CurrencyConverter.tsx:71` calls `GET https://open.er-api.com/v6/latest/${base}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/open.er-api.com/v6/latest/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5c1545494ab6166c", "name": "Unused endpoint: GET /api/me", "shortDescription": {"text": "Unused endpoint: GET /api/me"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `GET /api/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55890047a9ea2bbe", "name": "Unused endpoint: GET /api/quota", "shortDescription": {"text": "Unused endpoint: GET /api/quota"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `GET /api/quota` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-721b1a853bc1b2a3", "name": "Unused endpoint: GET /api/files", "shortDescription": {"text": "Unused endpoint: GET /api/files"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `GET /api/files` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b19f17b2b86602e7", "name": "Unused endpoint: GET /api/file", "shortDescription": {"text": "Unused endpoint: GET /api/file"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `GET /api/file` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-536fc60d1287e634", "name": "Unused endpoint: POST /api/upload", "shortDescription": {"text": "Unused endpoint: POST /api/upload"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `POST /api/upload` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-728aab1724f4a28b", "name": "Unused endpoint: POST /api/folder", "shortDescription": {"text": "Unused endpoint: POST /api/folder"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `POST /api/folder` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-efe3b29f67aab352", "name": "Unused endpoint: POST /api/rename", "shortDescription": {"text": "Unused endpoint: POST /api/rename"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `POST /api/rename` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fbaf2658242429c3", "name": "Unused endpoint: DELETE /api/files", "shortDescription": {"text": "Unused endpoint: DELETE /api/files"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `DELETE /api/files` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3a980efae5cb10c5", "name": "Unused endpoint: GET /api/trash", "shortDescription": {"text": "Unused endpoint: GET /api/trash"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `GET /api/trash` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a7c06ff9bd42fbfd", "name": "Unused endpoint: POST /api/trash/restore", "shortDescription": {"text": "Unused endpoint: POST /api/trash/restore"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `POST /api/trash/restore` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86a022be99cd50d4", "name": "Unused endpoint: DELETE /api/trash/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/trash/:id"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `DELETE /api/trash/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f5aa0a1e9ab4119b", "name": "Unused endpoint: DELETE /api/trash", "shortDescription": {"text": "Unused endpoint: DELETE /api/trash"}, "fullDescription": {"text": "`examples/file-server/server.mjs` declares `DELETE /api/trash` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-822e302df675ff25", "name": "Unused endpoint: GET /auth/me/", "shortDescription": {"text": "Unused endpoint: GET /auth/me/"}, "fullDescription": {"text": "`src/api/auth.ts` declares `GET /auth/me/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23a7b1cb75a9e58c", "name": "Unused endpoint: PATCH /auth/me/", "shortDescription": {"text": "Unused endpoint: PATCH /auth/me/"}, "fullDescription": {"text": "`src/api/auth.ts` declares `PATCH /auth/me/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5aec13f8b8650ea3", "name": "Unused endpoint: GET /auth/numbering-configs/", "shortDescription": {"text": "Unused endpoint: GET /auth/numbering-configs/"}, "fullDescription": {"text": "`src/api/auth.ts` declares `GET /auth/numbering-configs/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bbd716c14b05770e", "name": "Unused endpoint: GET /products/part-numbers/", "shortDescription": {"text": "Unused endpoint: GET /products/part-numbers/"}, "fullDescription": {"text": "`src/shell/WindowManager.tsx` declares `GET /products/part-numbers/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22211"}, "properties": {"repository": "victorymau/react-os-shell", "repoUrl": "https://github.com/victorymau/react-os-shell", "branch": "main"}, "results": [{"ruleId": "scanner-337714d062891481", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 examples/demo/src/BugReportsDemo.tsx:45"}, "properties": {"repobilityId": "d44e0918fb051e29", "scanner": "scanner-primary", "fingerprint": "337714d062891481", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5f376b572f766d73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 examples/demo/src/TableDemo.tsx:85"}, "properties": {"repobilityId": "4a0faf9427ded383", "scanner": "scanner-primary", "fingerprint": "5f376b572f766d73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ce04a8ca058aa09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/WorldClock.tsx:134"}, "properties": {"repobilityId": "e507a138a4af2985", "scanner": "scanner-primary", "fingerprint": "9ce04a8ca058aa09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0de4a6e743d014b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Preview.tsx:373"}, "properties": {"repobilityId": "fb618d95b4723045", "scanner": "scanner-primary", "fingerprint": "0de4a6e743d014b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2365e61155774671", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Notepad.tsx:347"}, "properties": {"repobilityId": "3c81eb9fe1cfeed4", "scanner": "scanner-primary", "fingerprint": "2365e61155774671", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-206c5ae16d0697b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Calculator.tsx:135"}, "properties": {"repobilityId": "d109c68eb805ca87", "scanner": "scanner-primary", "fingerprint": "206c5ae16d0697b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c71ee89d15122e7", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/apps/Documents.tsx:344"}, "properties": {"repobilityId": "f4cd0c06fbac6736", "scanner": "scanner-primary", "fingerprint": "1c71ee89d15122e7", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b28a29cc0d16560f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Weather.tsx:344"}, "properties": {"repobilityId": "1109624568c27a96", "scanner": "scanner-primary", "fingerprint": "b28a29cc0d16560f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02c06f716a1e5c2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/apps/Files.tsx:555"}, "properties": {"repobilityId": "8ff59b55f298382e", "scanner": "scanner-primary", "fingerprint": "02c06f716a1e5c2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d5d6cd1c947f3f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/WidgetManager.tsx:214"}, "properties": {"repobilityId": "dda1c1d55dcecb89", "scanner": "scanner-primary", "fingerprint": "6d5d6cd1c947f3f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1d52f7995de9330", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/WindowManager.tsx:377"}, "properties": {"repobilityId": "4f8aa45b58f4e7c8", "scanner": "scanner-primary", "fingerprint": "e1d52f7995de9330", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23c8e2d8cf5b8ccf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/MobileProfileSheet.tsx:52"}, "properties": {"repobilityId": "64c1a4f63381f998", "scanner": "scanner-primary", "fingerprint": "23c8e2d8cf5b8ccf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58b86f1e22994082", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/GlobalSearch.tsx:142"}, "properties": {"repobilityId": "32f5c46bb904f137", "scanner": "scanner-primary", "fingerprint": "58b86f1e22994082", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-74894e152301ec2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Breadcrumbs.tsx:80"}, "properties": {"repobilityId": "965c5fdb0655ca0d", "scanner": "scanner-primary", "fingerprint": "74894e152301ec2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1671e0a45cc2da9d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Modal.tsx:1720"}, "properties": {"repobilityId": "2f6e6d517a13ba16", "scanner": "scanner-primary", "fingerprint": "1671e0a45cc2da9d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9eec4249646ca533", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/NotificationBell.tsx:228"}, "properties": {"repobilityId": "05277a6c36b24e2d", "scanner": "scanner-primary", "fingerprint": "9eec4249646ca533", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-004cddb44ceeaa1a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Layout.tsx:153"}, "properties": {"repobilityId": "b26cf44085e7d066", "scanner": "scanner-primary", "fingerprint": "004cddb44ceeaa1a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba98e7bafc9c5e70", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/shell/Layout.tsx:527"}, "properties": {"repobilityId": "dcb1ee2908c9b64b", "scanner": "scanner-primary", "fingerprint": "ba98e7bafc9c5e70", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-45922c695f7974d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/Sidebar.tsx:175"}, "properties": {"repobilityId": "7ef4de6e6983cf57", "scanner": "scanner-primary", "fingerprint": "45922c695f7974d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f33eec95e374b932", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/MobileSwitcher.tsx:60"}, "properties": {"repobilityId": "7c6d55e256c84f43", "scanner": "scanner-primary", "fingerprint": "f33eec95e374b932", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-53143467a94e2f22", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/shell/EditableGrid.tsx:786"}, "properties": {"repobilityId": "d0d7ff2cde3ebdf0", "scanner": "scanner-primary", "fingerprint": "53143467a94e2f22", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fb05f512d53905b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/StartMenu.tsx:194"}, "properties": {"repobilityId": "a17dc27a31b64a4e", "scanner": "scanner-primary", "fingerprint": "fb05f512d53905b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa716ea4cf33b0ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/HelpCenter.tsx:190"}, "properties": {"repobilityId": "479bde0d38186086", "scanner": "scanner-primary", "fingerprint": "fa716ea4cf33b0ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-012dae85a3ff0320", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/shell/MobileHome.tsx:334"}, "properties": {"repobilityId": "88e8f79eea30a9e4", "scanner": "scanner-primary", "fingerprint": "012dae85a3ff0320", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-835eae4c7f17a2f8", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "7f864148270ee01e", "scanner": "scanner-primary", "fingerprint": "835eae4c7f17a2f8", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-835eae4c7f17a2f8", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "245733d0c62f6b11", "scanner": "scanner-primary", "fingerprint": "835eae4c7f17a2f8", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-8a9dad282208fbdd", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/apps/Preview.tsx:576"}, "properties": {"repobilityId": "41de2406bff8b511", "scanner": "scanner-primary", "fingerprint": "8a9dad282208fbdd", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/apps/Preview.tsx"}, "region": {"startLine": 576}}}]}, {"ruleId": "scanner-d58806b249137e83", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/apps/Documents.tsx:248"}, "properties": {"repobilityId": "dab430f1a2c7488c", "scanner": "scanner-primary", "fingerprint": "d58806b249137e83", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/apps/Documents.tsx"}, "region": {"startLine": 248}}}]}, {"ruleId": "scanner-c1c62134f757fe3e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/apps/Documents.tsx:344"}, "properties": {"repobilityId": "7fa2ac2ac360b6d1", "scanner": "scanner-primary", "fingerprint": "c1c62134f757fe3e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/apps/Documents.tsx"}, "region": {"startLine": 344}}}]}, {"ruleId": "scanner-f48550d44611d2d4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/shell/WindowManager.tsx:356"}, "properties": {"repobilityId": "f05105d36e101cce", "scanner": "scanner-primary", "fingerprint": "f48550d44611d2d4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/shell/WindowManager.tsx"}, "region": {"startLine": 356}}}]}, {"ruleId": "scanner-fca1c2a62e4126e1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/shell/EditableGrid.tsx:786"}, "properties": {"repobilityId": "b8aa0fc860ae965c", "scanner": "scanner-primary", "fingerprint": "fca1c2a62e4126e1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/shell/EditableGrid.tsx"}, "region": {"startLine": 786}}}]}, {"ruleId": "scanner-9729bcdaead87088", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/shell/toast.ts:78"}, "properties": {"repobilityId": "a67b25e1dab6cdb2", "scanner": "scanner-primary", "fingerprint": "9729bcdaead87088", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/shell/toast.ts"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-e4f658c0c00de0d4", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "25e1fa3783e7cb32", "scanner": "scanner-primary", "fingerprint": "e4f658c0c00de0d4", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pages.yml"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-448d8837178ae57a", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "13af6451e15656fc", "scanner": "scanner-primary", "fingerprint": "448d8837178ae57a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pages.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-98354498558aea85", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "82a1ca63044437ce", "scanner": "scanner-primary", "fingerprint": "98354498558aea85", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/screenshot.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5c02b180c301e28c", "level": "note", "message": {"text": "Very large file: src/apps/Preview.tsx (4121 lines)"}, "properties": {"repobilityId": "75400ff7af876a8e", "scanner": "scanner-primary", "fingerprint": "5c02b180c301e28c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4f7f5575a015504d", "level": "note", "message": {"text": "Very large file: src/shell/Modal.tsx (1970 lines)"}, "properties": {"repobilityId": "591d9b5721f7532a", "scanner": "scanner-primary", "fingerprint": "4f7f5575a015504d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ad010330ece20231", "level": "note", "message": {"text": "Very large file: src/shell/Layout.tsx (1126 lines)"}, "properties": {"repobilityId": "f24820c0c79031b3", "scanner": "scanner-primary", "fingerprint": "ad010330ece20231", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6613edc8d0ad3490", "level": "note", "message": {"text": "Very large file: src/shell/Desktop.tsx (1369 lines)"}, "properties": {"repobilityId": "ad532638f38e4605", "scanner": "scanner-primary", "fingerprint": "6613edc8d0ad3490", "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-c8280b913bfa8147", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: examples/file-server/package.json"}, "properties": {"repobilityId": "5573c63152196cec", "scanner": "scanner-primary", "fingerprint": "c8280b913bfa8147", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "examples/file-server/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "d9e2f96fb6ec2ee9", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "311272821750d219", "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": "ec3420aca0ef7395", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "bb20e8f946a057af", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "ed9a210dcabc814b", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "cac994d565dd4756", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "3b573bfa7c127b6b", "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": "a9e452129f4e046c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-c2885bd9eed901cd", "level": "none", "message": {"text": "Commented-code block (6 lines) in examples/file-server/server.mjs:1"}, "properties": {"repobilityId": "c0b3d17454f29ca5", "scanner": "scanner-primary", "fingerprint": "c2885bd9eed901cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-990abd7a12a551ae", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/settings/Customization.tsx:61"}, "properties": {"repobilityId": "ecd2da7e7786b1a7", "scanner": "scanner-primary", "fingerprint": "990abd7a12a551ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc29f958bbc6894e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/apps/Preview.tsx:127"}, "properties": {"repobilityId": "7c4ce121c49834e9", "scanner": "scanner-primary", "fingerprint": "fc29f958bbc6894e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fafc41accef5a12c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/apps/PomodoroTimer.tsx:148"}, "properties": {"repobilityId": "bdec2b044d28da4e", "scanner": "scanner-primary", "fingerprint": "fafc41accef5a12c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e3191ad06f6a5d12", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/apps/Spreadsheet.tsx:124"}, "properties": {"repobilityId": "0cf97a02684515bd", "scanner": "scanner-primary", "fingerprint": "e3191ad06f6a5d12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ddb6206bc299b13", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/apps/Browser.tsx:95"}, "properties": {"repobilityId": "5f097dc5195e3eaf", "scanner": "scanner-primary", "fingerprint": "4ddb6206bc299b13", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0019ce5a8d60dd9", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/shell/WidgetManager.tsx:114"}, "properties": {"repobilityId": "e5d608976311e3fa", "scanner": "scanner-primary", "fingerprint": "d0019ce5a8d60dd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d33333d3ded48a0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/shell/desktopIcons.tsx:195"}, "properties": {"repobilityId": "1204936206994420", "scanner": "scanner-primary", "fingerprint": "0d33333d3ded48a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81da31fde7780ed5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/shell/BugReportDialog.tsx:144"}, "properties": {"repobilityId": "70795a393df6a964", "scanner": "scanner-primary", "fingerprint": "81da31fde7780ed5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f7f79d0760d9899", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/shell/LogoutAnimation.tsx:5"}, "properties": {"repobilityId": "7027ca91d2ab626d", "scanner": "scanner-primary", "fingerprint": "4f7f79d0760d9899", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b8e81153be534d8", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/shell/Modal.tsx:333"}, "properties": {"repobilityId": "272bfa42486b758d", "scanner": "scanner-primary", "fingerprint": "7b8e81153be534d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-755144675cfa5eb3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/shell/Layout.tsx:778"}, "properties": {"repobilityId": "d2d35e0a788f4de8", "scanner": "scanner-primary", "fingerprint": "755144675cfa5eb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95bfcf33db1d9a83", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/shell/StartMenu.tsx:68"}, "properties": {"repobilityId": "6128578f87c23456", "scanner": "scanner-primary", "fingerprint": "95bfcf33db1d9a83", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51fc68eff7978793", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/shell/Desktop.tsx:50"}, "properties": {"repobilityId": "47c15aab87b92756", "scanner": "scanner-primary", "fingerprint": "51fc68eff7978793", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8bdb9b38a43a4ce7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/shell/pomodoroStore.ts:196"}, "properties": {"repobilityId": "8c48c60d998bd269", "scanner": "scanner-primary", "fingerprint": "8bdb9b38a43a4ce7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7502ee7adc9807da", "level": "error", "message": {"text": "Dangling fetch: GET https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}&current=temperature_2m,weather_code,is_day&daily=temperature_2m_max,temperature_2m_min&forecast_days=1&timezone=auto (src/apps/_weatherData.ts:92)"}, "properties": {"repobilityId": "b54547248e111f24", "scanner": "scanner-primary", "fingerprint": "7502ee7adc9807da", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3bef096a4f352571", "level": "error", "message": {"text": "Dangling fetch: GET https://open.er-api.com/v6/latest/${base} (src/apps/CurrencyConverter.tsx:71)"}, "properties": {"repobilityId": "ecf0c30b46c6cb92", "scanner": "scanner-primary", "fingerprint": "3bef096a4f352571", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c1545494ab6166c", "level": "note", "message": {"text": "Unused endpoint: GET /api/me"}, "properties": {"repobilityId": "a2a544e610d71b0b", "scanner": "scanner-primary", "fingerprint": "5c1545494ab6166c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-55890047a9ea2bbe", "level": "note", "message": {"text": "Unused endpoint: GET /api/quota"}, "properties": {"repobilityId": "3b6b097fb2a894ce", "scanner": "scanner-primary", "fingerprint": "55890047a9ea2bbe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-721b1a853bc1b2a3", "level": "note", "message": {"text": "Unused endpoint: GET /api/files"}, "properties": {"repobilityId": "eb32cd14f25c3073", "scanner": "scanner-primary", "fingerprint": "721b1a853bc1b2a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b19f17b2b86602e7", "level": "note", "message": {"text": "Unused endpoint: GET /api/file"}, "properties": {"repobilityId": "0b85b56682647c9b", "scanner": "scanner-primary", "fingerprint": "b19f17b2b86602e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-536fc60d1287e634", "level": "note", "message": {"text": "Unused endpoint: POST /api/upload"}, "properties": {"repobilityId": "1a2eaf7a3a4f5977", "scanner": "scanner-primary", "fingerprint": "536fc60d1287e634", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-728aab1724f4a28b", "level": "note", "message": {"text": "Unused endpoint: POST /api/folder"}, "properties": {"repobilityId": "24ac5b103f024114", "scanner": "scanner-primary", "fingerprint": "728aab1724f4a28b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-efe3b29f67aab352", "level": "note", "message": {"text": "Unused endpoint: POST /api/rename"}, "properties": {"repobilityId": "ef28775892b1816c", "scanner": "scanner-primary", "fingerprint": "efe3b29f67aab352", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fbaf2658242429c3", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/files"}, "properties": {"repobilityId": "4030b51d58ef061f", "scanner": "scanner-primary", "fingerprint": "fbaf2658242429c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a980efae5cb10c5", "level": "note", "message": {"text": "Unused endpoint: GET /api/trash"}, "properties": {"repobilityId": "187d8807083d85a3", "scanner": "scanner-primary", "fingerprint": "3a980efae5cb10c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7c06ff9bd42fbfd", "level": "note", "message": {"text": "Unused endpoint: POST /api/trash/restore"}, "properties": {"repobilityId": "8fe16eb5a18920ee", "scanner": "scanner-primary", "fingerprint": "a7c06ff9bd42fbfd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86a022be99cd50d4", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/trash/:id"}, "properties": {"repobilityId": "f41a34c63124e3d5", "scanner": "scanner-primary", "fingerprint": "86a022be99cd50d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5aa0a1e9ab4119b", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/trash"}, "properties": {"repobilityId": "96d7c841212b1b01", "scanner": "scanner-primary", "fingerprint": "f5aa0a1e9ab4119b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-822e302df675ff25", "level": "note", "message": {"text": "Unused endpoint: GET /auth/me/"}, "properties": {"repobilityId": "d8b53192489c3e9f", "scanner": "scanner-primary", "fingerprint": "822e302df675ff25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23a7b1cb75a9e58c", "level": "note", "message": {"text": "Unused endpoint: PATCH /auth/me/"}, "properties": {"repobilityId": "eeb5217de4e67cd6", "scanner": "scanner-primary", "fingerprint": "23a7b1cb75a9e58c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5aec13f8b8650ea3", "level": "note", "message": {"text": "Unused endpoint: GET /auth/numbering-configs/"}, "properties": {"repobilityId": "59385a47be13741a", "scanner": "scanner-primary", "fingerprint": "5aec13f8b8650ea3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bbd716c14b05770e", "level": "note", "message": {"text": "Unused endpoint: GET /products/part-numbers/"}, "properties": {"repobilityId": "1e35b95e5ce4e692", "scanner": "scanner-primary", "fingerprint": "bbd716c14b05770e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}