{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:03.277592Z","repo":{"ref":{"host":"github.com","owner":"byoutline","name":"kickmaterial"},"default_branch":"master","clone_url":"https://github.com/byoutline/kickmaterial.git","html_url":"https://github.com/byoutline/kickmaterial","description":"Crowdfunding app concept for Android. Created to showcase new trends in Android development with strong focus on Material Design.","stars":1611,"forks":289,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":39656,"primary_language":"Kotlin","license_spdx":"Apache-2.0","created_at":"2015-10-01T15:24:43Z","pushed_at":"2018-11-14T15:57:36Z","security_policy_url":null,"distribution":{"owner_created_at":"2014-06-30T13:18:02Z","owner_type":"Organization","release_assets":[]}},"commit_sha":"25181c9ce4fdf5c76e40bc747a6f93f31e1bac9d","profile":{"lines_by_language":{"Kotlin":4095,"Java":148,"Shell":35},"files_by_category":{"config":81,"source":72,"binary":69,"other":48,"oversized":8,"docs":2,"test":2},"source_lines":4209,"test_lines":69},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.65,"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":80.7,"confidence":0.9,"coverage":1.0,"label":"strong","breakdown":{"complexity":100.0,"duplication":91.8,"lint":87.5,"testing":60.9,"docs":65.0,"type_safety":null,"process":null},"summary":"Code quality is strong: test-to-source ratio 0.02, CI runs tests; 0% of function code in complex or long functions; 1% duplicated lines. Weakest area: testing."},"security":{"score":80.0,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":100.0,"sast":95.1,"dependencies":null,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is adequate: no high-impact 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":171.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":14616.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2015-10":{"loc":6107,"attributed_loc":0},"2015-11":{"loc":44,"attributed_loc":0},"2015-12":{"loc":2,"attributed_loc":0},"2016-01":{"loc":155,"attributed_loc":0},"2016-02":{"loc":0,"attributed_loc":0},"2016-03":{"loc":322,"attributed_loc":0},"2016-05":{"loc":41,"attributed_loc":0},"2016-10":{"loc":111,"attributed_loc":0},"2016-11":{"loc":0,"attributed_loc":0},"2017-08":{"loc":6086,"attributed_loc":0},"2017-09":{"loc":29,"attributed_loc":0},"2017-10":{"loc":397,"attributed_loc":0},"2017-11":{"loc":1276,"attributed_loc":0},"2017-12":{"loc":1,"attributed_loc":0},"2018-01":{"loc":3,"attributed_loc":0},"2018-10":{"loc":42,"attributed_loc":0},"2018-11":{"loc":0,"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-4","metrics":{"work_units":50.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":3867.0,"pre_ai_era_burst_loc":0.0,"measured_loc":3867.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":123.77939760693165,"median_loc_per_hour":51.49833077385324,"pr_timed_units":2.0,"excluded_import_loc":10749.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["ee314bff89335c7186df56f0b9fe578b81e7b6d6","f4cc59876384b95b0488dbffd169c76976039667"]},"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":4209.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":1.0,"findings_high":0.0,"findings_medium":1.0,"findings_low":0.0,"weighted_findings":0.6,"scanned_lines":4209.0,"parse_errors":1.0},"findings":[{"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":"app/src/main/AndroidManifest.xml","line":16,"fingerprint":"java.android.security.exported_activity:app/src/main/AndroidManifest.xml:16"}],"evidence":[],"data":{"rulesets":["kotlin","java","bash"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"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.0058,"unpinned_manifests":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":308.0,"function_nloc":1867.0,"mean_ccn":1.44,"p90_ccn":2.0,"complex_functions":0.0,"long_functions":0.0,"many_param_functions":1.0,"risky_nloc_share":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":2188.0,"duplicated_lines":31.0,"duplicated_share":0.0142,"files":72.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: app/src/main/java/com/byoutline/kickmaterial/features/projectdetails/ObservableScrollView.kt:2 and app/src/main/java/com/byoutline/kickmaterial/utils/LUtils.kt:2","ref":"app/src/main/java/com/byoutline/kickmaterial/features/projectdetails/ObservableScrollView.kt","url":"https://github.com/byoutline/kickmaterial/blob/25181c9ce4fdf5c76e40bc747a6f93f31e1bac9d/app/src/main/java/com/byoutline/kickmaterial/features/projectdetails/ObservableScrollView.kt#L2","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: app/src/main/java/com/byoutline/kickmaterial/features/projectdetails/ObservableScrollView.kt:4 and app/src/main/java/com/byoutline/kickmaterial/transitions/CircleTransition.kt:4","ref":"app/src/main/java/com/byoutline/kickmaterial/features/projectdetails/ObservableScrollView.kt","url":"https://github.com/byoutline/kickmaterial/blob/25181c9ce4fdf5c76e40bc747a6f93f31e1bac9d/app/src/main/java/com/byoutline/kickmaterial/features/projectdetails/ObservableScrollView.kt#L4","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: app/src/main/java/com/byoutline/kickmaterial/transitions/CircleTransition.kt:10 and app/src/main/java/com/byoutline/kickmaterial/utils/LUtils.kt:10","ref":"app/src/main/java/com/byoutline/kickmaterial/transitions/CircleTransition.kt","url":"https://github.com/byoutline/kickmaterial/blob/25181c9ce4fdf5c76e40bc747a6f93f31e1bac9d/app/src/main/java/com/byoutline/kickmaterial/transitions/CircleTransition.kt#L10","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":6.0,"weighted_findings":2.25,"scanned_lines":4209.0,"category:best-practice":1.0,"category:correctness":5.0},"findings":[{"rule_id":"opengrep/bash.lang.best-practice.useless-cat","severity":"medium","message":"Useless call to 'cat' in a pipeline. Use '<' and '>' for any command to read from a file or write to a file.","path":"ci/update_android_dependencies.sh","line":5,"fingerprint":"bash.lang.best-practice.useless-cat:ci/update_android_dependencies.sh:5"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"ci/launchEmu.sh","line":4,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:ci/launchEmu.sh:4"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"ci/update_android_dependencies.sh","line":5,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:ci/update_android_dependencies.sh:5"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"ci/update_android_dependencies.sh","line":17,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:ci/update_android_dependencies.sh:17"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"ci/update_android_dependencies.sh","line":22,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:ci/update_android_dependencies.sh:22"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"ci/update_android_dependencies.sh","line":23,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:ci/update_android_dependencies.sh:23"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.0328,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.507,"test_lines":69.0,"source_lines":4209.0,"test_ratio":0.0164,"ci_files":1.0,"cochange_share":0.1268,"cochange_commits":71.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .travis.yml","ref":".travis.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (./gradlew check, unittest)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["./gradlew check","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":0.0,"check:changelog":0.0,"readme_lines":45.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}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}