{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T15:04:01.670025Z","repo":{"ref":{"host":"github.com","owner":"faizfahmi77","name":"ScanDot"},"default_branch":"main","clone_url":"https://github.com/faizfahmi77/ScanDot.git","html_url":"https://github.com/faizfahmi77/ScanDot","description":"Experimental Android 3D scanning and point-cloud viewer","stars":466,"forks":4,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":151,"primary_language":"Kotlin","license_spdx":"MIT","created_at":"2026-11-13T04:07:57Z","pushed_at":"2026-11-13T04:27:21Z","security_policy_url":null,"distribution":{"owner_created_at":"2015-12-10T04:30:11Z","owner_type":"User","release_assets":[{"name":"ScanDot-v0.3.0-preview.1-debug.apk","size":12452551,"download_count":18,"release_tag":"v0.3.0-preview.1","url":"https://github.com/faizfahmi77/ScanDot/releases/download/v0.3.0-preview.1/ScanDot-v0.3.0-preview.1-debug.apk"},{"name":"ScanDot-v0.3.0-preview.1-SHA256SUMS.txt","size":102,"download_count":5,"release_tag":"v0.3.0-preview.1","url":"https://github.com/faizfahmi77/ScanDot/releases/download/v0.3.0-preview.1/ScanDot-v0.3.0-preview.1-SHA256SUMS.txt"}]}},"commit_sha":"dbd6f4e3c616a565685b4353ae71b16bdf49ba3b","profile":{"lines_by_language":{"Kotlin":2626,"Python":1226,"PowerShell":88,"Java":33},"files_by_category":{"source":27,"test":11,"config":7,"other":5,"docs":4,"binary":1},"source_lines":2831,"test_lines":1142},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.41,"coverage":1.0,"label":"none-detected","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":null,"style_index":0.0},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":75.5,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":33.4,"duplication":100.0,"lint":100.0,"testing":85.2,"docs":80.0,"type_safety":40.0,"process":null},"summary":"Code quality is adequate: test-to-source ratio 0.40, CI runs tests; 37% of function code in complex or long functions; 0% duplicated lines. Weakest area: complexity."},"security":{"score":65.4,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":100.0,"sast":31.7,"dependencies":null,"ci_actions":96.1,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 7 high-severity SAST findings. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no registry dependencies declared"},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":5.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":5842.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2026-11":{"loc":5842,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-5","metrics":{"work_units":1.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":54.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":13.073301950235374,"median_loc_per_hour":0.0,"pr_timed_units":0.0,"excluded_import_loc":5788.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["e3c226abd89964cb9546981020c40aa76b900457"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":2831.0,"index":0.0,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":8.0,"findings_high":7.0,"findings_medium":1.0,"findings_low":0.0,"weighted_findings":9.0,"scanned_lines":2743.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"android-app/tools/check_cloud_gl.py","line":38,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:android-app/tools/check_cloud_gl.py:38"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-tainted-env-args","severity":"high","message":"Detected subprocess function 'run' with user controlled data. A malicious actor could leverage this to perform command injection. You may consider using 'shlex.quote()'. [confidence medium]","path":"android-app/tools/check_cloud_gl.py","line":38,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-tainted-env-args:android-app/tools/check_cloud_gl.py:38"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"android-app/tools/check_cloud_gl.py","line":41,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:android-app/tools/check_cloud_gl.py:41"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-tainted-env-args","severity":"high","message":"Detected subprocess function 'run' with user controlled data. A malicious actor could leverage this to perform command injection. You may consider using 'shlex.quote()'. [confidence medium]","path":"android-app/tools/check_cloud_gl.py","line":41,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-tainted-env-args:android-app/tools/check_cloud_gl.py:41"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"processing/benchmark.py","line":111,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:processing/benchmark.py:111"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"processing/densify.py","line":68,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:processing/densify.py:68"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-tainted-env-args","severity":"high","message":"Detected subprocess function 'run' with user controlled data. A malicious actor could leverage this to perform command injection. You may consider using 'shlex.quote()'. [confidence medium]","path":"processing/densify.py","line":68,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-tainted-env-args:processing/densify.py:68"},{"rule_id":"opengrep/java.android.security.exported_activity","severity":"medium","message":"The application exports an activity. Any application on the device can launch the exported activity which may compromise the integrity of your application or its data.  Ensure that any exported activities do not have privileged access to your application's control plane. [confidence medium]","path":"android-app/app/src/main/AndroidManifest.xml","line":8,"fingerprint":"java.android.security.exported_activity:android-app/app/src/main/AndroidManifest.xml:8"}],"evidence":[],"data":{"rulesets":["kotlin","python","java"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":1.0,"findings":2.0,"findings_high":0.0,"findings_medium":2.0,"findings_low":0.0,"penalty":2.4},"findings":[{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/ci.yml","line":21,"fingerprint":"artipacked:.github/workflows/ci.yml:21"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/ci.yml","line":34,"fingerprint":"artipacked:.github/workflows/ci.yml:34"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":0.0,"check:lockfiles":1.0,"signed_commit_share":0.0,"unpinned_manifests":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":2.0,"binary_assets":1.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v0.3.0-preview.1 ships ScanDot-v0.3.0-preview.1-debug.apk (18 downloads)","ref":"ScanDot-v0.3.0-preview.1-debug.apk","url":"https://github.com/faizfahmi77/ScanDot/releases/download/v0.3.0-preview.1/ScanDot-v0.3.0-preview.1-debug.apk","weight":0.0},{"kind":"star-burst","description":"466 stars in 1 days (320/day)","ref":null,"url":null,"weight":0.0}],"data":{"signals":["binary-release-assets","star-burst"],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":163.0,"function_nloc":1947.0,"mean_ccn":3.96,"p90_ccn":8.0,"complex_functions":9.0,"long_functions":1.0,"many_param_functions":1.0,"risky_nloc_share":0.3657},"findings":[],"evidence":[{"kind":"complex-function","description":"onDrawFrame in android-app/app/src/main/java/com/roomscan/app/OnDeviceCaptureActivity.kt: complexity 47, 80 lines","ref":"android-app/app/src/main/java/com/roomscan/app/OnDeviceCaptureActivity.kt","url":"https://github.com/faizfahmi77/ScanDot/blob/dbd6f4e3c616a565685b4353ae71b16bdf49ba3b/android-app/app/src/main/java/com/roomscan/app/OnDeviceCaptureActivity.kt#L437","weight":0.7833333333333333},{"kind":"complex-function","description":"integrate in android-app/app/src/main/java/com/roomscan/app/DepthFusion.kt: complexity 36, 84 lines","ref":"android-app/app/src/main/java/com/roomscan/app/DepthFusion.kt","url":"https://github.com/faizfahmi77/ScanDot/blob/dbd6f4e3c616a565685b4353ae71b16bdf49ba3b/android-app/app/src/main/java/com/roomscan/app/DepthFusion.kt#L54","weight":0.6},{"kind":"complex-function","description":"startSession in android-app/app/src/main/java/com/roomscan/app/OnDeviceCaptureActivity.kt: complexity 35, 83 lines","ref":"android-app/app/src/main/java/com/roomscan/app/OnDeviceCaptureActivity.kt","url":"https://github.com/faizfahmi77/ScanDot/blob/dbd6f4e3c616a565685b4353ae71b16bdf49ba3b/android-app/app/src/main/java/com/roomscan/app/OnDeviceCaptureActivity.kt#L192","weight":0.5833333333333334},{"kind":"complex-function","description":"reconstruct in processing/benchmark.py: complexity 28, 94 lines","ref":"processing/benchmark.py","url":"https://github.com/faizfahmi77/ScanDot/blob/dbd6f4e3c616a565685b4353ae71b16bdf49ba3b/processing/benchmark.py#L267","weight":0.4666666666666667},{"kind":"complex-function","description":"read_sample in tools/render-preview.py: complexity 24, 50 lines","ref":"tools/render-preview.py","url":"https://github.com/faizfahmi77/ScanDot/blob/dbd6f4e3c616a565685b4353ae71b16bdf49ba3b/tools/render-preview.py#L16","weight":0.4},{"kind":"complex-function","description":"ply_vertex_count in processing/benchmark.py: complexity 23, 39 lines","ref":"processing/benchmark.py","url":"https://github.com/faizfahmi77/ScanDot/blob/dbd6f4e3c616a565685b4353ae71b16bdf49ba3b/processing/benchmark.py#L147","weight":0.38333333333333336},{"kind":"complex-function","description":"main in processing/densify.py: complexity 23, 75 lines","ref":"processing/densify.py","url":"https://github.com/faizfahmi77/ScanDot/blob/dbd6f4e3c616a565685b4353ae71b16bdf49ba3b/processing/densify.py#L14","weight":0.38333333333333336},{"kind":"complex-function","description":"(anonymous) in android-app/app/src/main/java/com/roomscan/app/MainActivity.kt: complexity 16, 41 lines","ref":"android-app/app/src/main/java/com/roomscan/app/MainActivity.kt","url":"https://github.com/faizfahmi77/ScanDot/blob/dbd6f4e3c616a565685b4353ae71b16bdf49ba3b/android-app/app/src/main/java/com/roomscan/app/MainActivity.kt#L94","weight":0.26666666666666666},{"kind":"complex-function","description":"main in android-app/tools/check_cloud_gl.py: complexity 16, 166 lines","ref":"android-app/tools/check_cloud_gl.py","url":"https://github.com/faizfahmi77/ScanDot/blob/dbd6f4e3c616a565685b4353ae71b16bdf49ba3b/android-app/tools/check_cloud_gl.py#L46","weight":0.26666666666666666}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":2129.0,"duplicated_lines":0.0,"duplicated_share":0.0,"files":27.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":0.0,"weighted_findings":0.0,"scanned_lines":2743.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.8068,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":1.0,"test_lines":1142.0,"source_lines":2831.0,"test_ratio":0.4034,"ci_files":1.0,"cochange_share":1.0,"cochange_commits":2.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/ci.yml","ref":".github/workflows/ci.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (unittest)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["unittest"],"lint_commands":[]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":1.0,"check:contributing":1.0,"check:changelog":0.0,"readme_lines":39.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","url":null,"weight":0.0},{"kind":"docs","description":"CONTRIBUTING.md","ref":"CONTRIBUTING.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":0.0,"check:low_escape_density":1.0,"escapes":5.0,"escapes_per_kloc":5.0},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}