{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:01.939707Z","repo":{"ref":{"host":"github.com","owner":"ThomasVanRiel","name":"solitaire"},"default_branch":"main","clone_url":"https://github.com/ThomasVanRiel/solitaire.git","html_url":"https://github.com/ThomasVanRiel/solitaire","description":null,"stars":0,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":17880,"primary_language":"Kotlin","license_spdx":"GPL-3.0","created_at":"2026-10-24T20:30:57Z","pushed_at":"2026-11-02T11:41:22Z","security_policy_url":null,"distribution":{"owner_created_at":"2015-03-09T16:15:18Z","owner_type":"User","release_assets":[{"name":"solitaire-1.1.0.apk","size":9248643,"download_count":3,"release_tag":"v1.1.0","url":"https://github.com/ThomasVanRiel/solitaire/releases/download/v1.1.0/solitaire-1.1.0.apk"},{"name":"solitaire-1.0.0.apk","size":9232259,"download_count":5,"release_tag":"v1.0.0","url":"https://github.com/ThomasVanRiel/solitaire/releases/download/v1.0.0/solitaire-1.0.0.apk"}]}},"commit_sha":"bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e","profile":{"lines_by_language":{"Kotlin":10603,"Shell":76},"files_by_category":{"source":58,"binary":44,"test":14,"docs":10,"config":9,"other":5},"source_lines":8622,"test_lines":2057},"pillars":{"ai_provenance":{"score":100.0,"confidence":0.84,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":1.0,"suspected_share":0.0,"estimated_share":1.0,"ai_artifacts":1.0,"flagged_work_units":3.0,"flagged_releases":0.0,"style_index":0.116},"summary":"Explicit AI attribution on 100% of first-party code added; an estimated 100% including velocity signals."},"quality":{"score":66.0,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":52.1,"duplication":62.7,"lint":93.7,"testing":56.9,"docs":80.0,"type_safety":null,"process":null},"summary":"Code quality is adequate: test-to-source ratio 0.24, no CI test run detected; 22% of function code in complex or long functions; 8% duplicated lines. Weakest area: complexity."},"security":{"score":72.0,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":100.0,"sast":100.0,"dependencies":null,"ci_actions":36.1,"posture":0.0,"scorecard":null},"summary":"Security posture is adequate: 5 high-severity workflow issues. 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":57.0,"attributed_commits":57.0,"attributed_commit_share":1.0,"effective_loc":11842.0,"attributed_loc":11842.0,"attributed_loc_share":1.0,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 57 attributed commits, 11,842 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e","url":"https://github.com/ThomasVanRiel/solitaire/commit/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"6800ae6e8062137c933f824021f6a8c66431cfea","url":"https://github.com/ThomasVanRiel/solitaire/commit/6800ae6e8062137c933f824021f6a8c66431cfea","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"64d19758f9be568c9f8034b1b85a9a00e5ce4512","url":"https://github.com/ThomasVanRiel/solitaire/commit/64d19758f9be568c9f8034b1b85a9a00e5ce4512","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"1ee7dd3bbe32c8dc76b8b1d2807f1d9bd0d6401a","url":"https://github.com/ThomasVanRiel/solitaire/commit/1ee7dd3bbe32c8dc76b8b1d2807f1d9bd0d6401a","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"24b15399a33b2d4c05226b8e938679934a8ee82b","url":"https://github.com/ThomasVanRiel/solitaire/commit/24b15399a33b2d4c05226b8e938679934a8ee82b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"d9362c422eaec2d99e9fd0a8fbc5ace59ced372d","url":"https://github.com/ThomasVanRiel/solitaire/commit/d9362c422eaec2d99e9fd0a8fbc5ace59ced372d","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"7f1b52b68fca9641dea995964e670d715a08dcf9","url":"https://github.com/ThomasVanRiel/solitaire/commit/7f1b52b68fca9641dea995964e670d715a08dcf9","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"ac49fdae96cc01f7ef7ecb4acc3133601ce3637c","url":"https://github.com/ThomasVanRiel/solitaire/commit/ac49fdae96cc01f7ef7ecb4acc3133601ce3637c","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"152004594e956df9c0419de7d07f7a45731cf449","url":"https://github.com/ThomasVanRiel/solitaire/commit/152004594e956df9c0419de7d07f7a45731cf449","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"ee9da44187acd589bf53064e65180a01b6a93285","url":"https://github.com/ThomasVanRiel/solitaire/commit/ee9da44187acd589bf53064e65180a01b6a93285","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b8ce25d514ee040c26f00733c93fb3e1534cefa5","url":"https://github.com/ThomasVanRiel/solitaire/commit/b8ce25d514ee040c26f00733c93fb3e1534cefa5","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"55b3e285225b6ad7b6b9e05b3f0552a02cb73b00","url":"https://github.com/ThomasVanRiel/solitaire/commit/55b3e285225b6ad7b6b9e05b3f0552a02cb73b00","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"4881309829c16f0f60f21cc5683d746b7badc6ce","url":"https://github.com/ThomasVanRiel/solitaire/commit/4881309829c16f0f60f21cc5683d746b7badc6ce","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"f9a8efb1b5403979e7e34a89951608312aec17b7","url":"https://github.com/ThomasVanRiel/solitaire/commit/f9a8efb1b5403979e7e34a89951608312aec17b7","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"cbac73e16e51136696be98f0fae339824a1cbf32","url":"https://github.com/ThomasVanRiel/solitaire/commit/cbac73e16e51136696be98f0fae339824a1cbf32","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"e3b5f1f40cbab84f5e4358e6255afba7fbfd24a7","url":"https://github.com/ThomasVanRiel/solitaire/commit/e3b5f1f40cbab84f5e4358e6255afba7fbfd24a7","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"cb99fa7368cd7457c3a8226c3e77bcb1a67f4360","url":"https://github.com/ThomasVanRiel/solitaire/commit/cb99fa7368cd7457c3a8226c3e77bcb1a67f4360","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"7735b4c11f8b528df7279f8a25e0f3152314532e","url":"https://github.com/ThomasVanRiel/solitaire/commit/7735b4c11f8b528df7279f8a25e0f3152314532e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b011d0f975f1791a4508e0bff1fc9c855f99ecca","url":"https://github.com/ThomasVanRiel/solitaire/commit/b011d0f975f1791a4508e0bff1fc9c855f99ecca","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"180e8a0461db868cba3b6092566d1d9d85e98bdb","url":"https://github.com/ThomasVanRiel/solitaire/commit/180e8a0461db868cba3b6092566d1d9d85e98bdb","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"e54b3cafe10684caf1521466d4f7d1d48e200ada","url":"https://github.com/ThomasVanRiel/solitaire/commit/e54b3cafe10684caf1521466d4f7d1d48e200ada","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"1e300741281a59c2205d941bc89051303deaf8cc","url":"https://github.com/ThomasVanRiel/solitaire/commit/1e300741281a59c2205d941bc89051303deaf8cc","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"7f02176ebd66923f7b6c4b69ae721ea4d9db7e94","url":"https://github.com/ThomasVanRiel/solitaire/commit/7f02176ebd66923f7b6c4b69ae721ea4d9db7e94","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"36f5ffc8c31119bea8f8d1737d789e9374c9d153","url":"https://github.com/ThomasVanRiel/solitaire/commit/36f5ffc8c31119bea8f8d1737d789e9374c9d153","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"7da5ad4028f40d2cc909f7467f519b7070d8708e","url":"https://github.com/ThomasVanRiel/solitaire/commit/7da5ad4028f40d2cc909f7467f519b7070d8708e","weight":0.9}],"data":{"attributed_loc_by_commit":{"febee3e77039ae90a552e18c7a7d35affa04cf84":225,"8ff6bd8990c0226e79fa990bc006c400d90af4a4":0,"2a7b63123c89e6dc3c93bd42d7bfcdd82a9b6f11":1214,"14e02472a5f7b5b5bd08acfeb1d6fc1429eb45bb":2547,"ffc0c216a515d93f902d32fee56dd76232aca5d5":40,"3ef1215af3b5c00db85e699d463526c1d7de38f6":4,"7e1a06db7d57de57abd60d0f5684d6f6c84330a1":46,"de0f92424bdbef9dc0bfc829b0b69a2021be36d8":5,"ce61965c82c6ee027e93c6f82ada55b31ad0fe26":0,"44e4ede354a2057a7cc19c2fdc65c17994975123":63,"447bbb7ca1ec5ef474b1f3987c65b141434602b4":495,"01d2122a46be71d9c1ce7d221e6326e5ce89c211":0,"5fad9363d87b3a529610993e82f084aa2e042659":32,"0752a0aa30016d4280e6011f631c918d5ba1e629":22,"d61622a615771dea40d443734cbce3ffd52446bc":1655,"5870be8e6d15666c25f901cada9f1d706956b865":0,"cfe367ba44b44f6343c576a49a3ec956d10e84c7":627,"d660d8698868af2ed6860a6603af531d8113787d":12,"d718b6bb75e6e46dc74b122d0f5c2641417c87da":18,"4f79983cc55d0ed9446bc0dfdeee477c583b95a1":1,"d5cf91c0e70c7509dfec3fab6197177acebd7e5a":0,"085518062f5597443d58c1ac69f7ab9dc3dc5b68":454,"1ad1d683586aa1bcca361307fba2c32667716bd3":0,"33f78974a9a0b602187a043a83e902392f8cc7a6":0,"8ff58a929ff7d0e5e4dbcd435b3fa6a23b62e085":0,"27651b20e11b3e2d962674fce8c4dfe3446e663a":0,"4760078438989163120b37c7ea136967326ba95c":0,"e1a9e044a5460bffa7df477fdf201a2ca92ec104":0,"003589d5abd791a00b68500a6f768a7fb520301f":1329,"9bf34a1e00d8016a57c895b1996152382e2b5dc8":2,"64f2576ed1f1419f4c90dc78ff6fb97be0651c25":27,"d163b85ae23169aed4b8d4f8bba5907b36cf019e":23,"7da5ad4028f40d2cc909f7467f519b7070d8708e":41,"36f5ffc8c31119bea8f8d1737d789e9374c9d153":0,"7f02176ebd66923f7b6c4b69ae721ea4d9db7e94":1516,"1e300741281a59c2205d941bc89051303deaf8cc":167,"e54b3cafe10684caf1521466d4f7d1d48e200ada":0,"180e8a0461db868cba3b6092566d1d9d85e98bdb":149,"b011d0f975f1791a4508e0bff1fc9c855f99ecca":7,"7735b4c11f8b528df7279f8a25e0f3152314532e":0,"cb99fa7368cd7457c3a8226c3e77bcb1a67f4360":240,"e3b5f1f40cbab84f5e4358e6255afba7fbfd24a7":35,"cbac73e16e51136696be98f0fae339824a1cbf32":357,"f9a8efb1b5403979e7e34a89951608312aec17b7":7,"4881309829c16f0f60f21cc5683d746b7badc6ce":5,"55b3e285225b6ad7b6b9e05b3f0552a02cb73b00":62,"b8ce25d514ee040c26f00733c93fb3e1534cefa5":0,"ee9da44187acd589bf53064e65180a01b6a93285":18,"152004594e956df9c0419de7d07f7a45731cf449":2,"ac49fdae96cc01f7ef7ecb4acc3133601ce3637c":16,"7f1b52b68fca9641dea995964e670d715a08dcf9":174,"d9362c422eaec2d99e9fd0a8fbc5ace59ced372d":1,"24b15399a33b2d4c05226b8e938679934a8ee82b":2,"1ee7dd3bbe32c8dc76b8b1d2807f1d9bd0d6401a":0,"bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e":2,"6800ae6e8062137c933f824021f6a8c66431cfea":0,"64d19758f9be568c9f8034b1b85a9a00e5ce4512":200},"tools":{"claude-code":{"name":"Claude Code","commits":57,"loc":11842,"first_seen":1792867595,"last_seen":1793619664}},"monthly":{"2026-10":{"loc":11640,"attributed_loc":11640},"2026-11":{"loc":202,"attributed_loc":202}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":1.0,"workflow_agents":0.0,"tools_configured":1.0,"earliest_adoption":1792867595.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":"CLAUDE.md (claude-code configuration)","ref":"CLAUDE.md","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/CLAUDE.md","weight":0.5}],"data":{"artifacts":[{"tool":"claude-code","path":"CLAUDE.md","added_at":1792867595}],"workflows":[],"tools":["claude-code"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":11.0,"flagged_units":3.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":11842.0,"flagged_loc":6988.0,"flagged_loc_share":0.5901030231379835,"max_loc_per_hour":1522.9329173166927,"median_loc_per_hour":222.16043226458982,"pr_timed_units":0.0,"excluded_import_loc":0.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"3,254 lines of first-party code in ~2.1h (1,523 lines/hour, 9 commit session)","ref":"0752a0aa30016d4280e6011f631c918d5ba1e629","url":"https://github.com/ThomasVanRiel/solitaire/commit/0752a0aa30016d4280e6011f631c918d5ba1e629","weight":0.45687987519500783},{"kind":"velocity-burst","description":"2,312 lines of first-party code in ~1.6h (1,473 lines/hour, 4 commit session)","ref":"d718b6bb75e6e46dc74b122d0f5c2641417c87da","url":"https://github.com/ThomasVanRiel/solitaire/commit/d718b6bb75e6e46dc74b122d0f5c2641417c87da","weight":0.4417834394904459},{"kind":"velocity-burst","description":"1,422 lines of first-party code in ~1.4h (1,022 lines/hour, 5 commit session)","ref":"7da5ad4028f40d2cc909f7467f519b7070d8708e","url":"https://github.com/ThomasVanRiel/solitaire/commit/7da5ad4028f40d2cc909f7467f519b7070d8708e","weight":0.3065389221556887}],"data":{"flagged_loc_by_commit":{"14e02472a5f7b5b5bd08acfeb1d6fc1429eb45bb":2547,"ffc0c216a515d93f902d32fee56dd76232aca5d5":40,"3ef1215af3b5c00db85e699d463526c1d7de38f6":4,"7e1a06db7d57de57abd60d0f5684d6f6c84330a1":46,"de0f92424bdbef9dc0bfc829b0b69a2021be36d8":5,"44e4ede354a2057a7cc19c2fdc65c17994975123":63,"447bbb7ca1ec5ef474b1f3987c65b141434602b4":495,"5fad9363d87b3a529610993e82f084aa2e042659":32,"0752a0aa30016d4280e6011f631c918d5ba1e629":22,"d61622a615771dea40d443734cbce3ffd52446bc":1655,"cfe367ba44b44f6343c576a49a3ec956d10e84c7":627,"d660d8698868af2ed6860a6603af531d8113787d":12,"d718b6bb75e6e46dc74b122d0f5c2641417c87da":18,"003589d5abd791a00b68500a6f768a7fb520301f":1329,"9bf34a1e00d8016a57c895b1996152382e2b5dc8":2,"64f2576ed1f1419f4c90dc78ff6fb97be0651c25":27,"d163b85ae23169aed4b8d4f8bba5907b36cf019e":23,"7da5ad4028f40d2cc909f7467f519b7070d8708e":41},"excluded_import_commits":[]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":1.0,"flagged_releases":0.0,"max_loc_per_day":0.0},"findings":[],"evidence":[],"data":{"releases":[{"from":"v1.0.0","to":"v1.1.0","loc":0,"days":0.04,"loc_per_day":0.0,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":8622.0,"index":0.116,"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":2.0,"per_kloc:emoji_in_code":0.232,"files:emoji_in_code":2.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":0.0,"findings_high":0.0,"findings_medium":0.0,"findings_low":0.0,"weighted_findings":0.0,"scanned_lines":8622.0,"parse_errors":1.0},"findings":[],"evidence":[],"data":{"rulesets":["kotlin","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":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":1.0,"findings":6.0,"findings_high":5.0,"findings_medium":1.0,"findings_low":0.0,"penalty":61.2},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":16,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:16"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":17,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:17"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":21,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:21"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":22,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:22"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":32,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:32"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/ci.yml","line":16,"fingerprint":"artipacked:.github/workflows/ci.yml:16"}],"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":1.0,"binary_assets":2.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v1.1.0 ships solitaire-1.1.0.apk (3 downloads)","ref":"solitaire-1.1.0.apk","url":"https://github.com/ThomasVanRiel/solitaire/releases/download/v1.1.0/solitaire-1.1.0.apk","weight":0.0},{"kind":"binary-release-asset","description":"release v1.0.0 ships solitaire-1.0.0.apk (5 downloads)","ref":"solitaire-1.0.0.apk","url":"https://github.com/ThomasVanRiel/solitaire/releases/download/v1.0.0/solitaire-1.0.0.apk","weight":0.0}],"data":{"signals":["binary-release-assets"],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":478.0,"function_nloc":4942.0,"mean_ccn":3.89,"p90_ccn":9.0,"complex_functions":19.0,"long_functions":2.0,"many_param_functions":4.0,"risky_nloc_share":0.2175},"findings":[],"evidence":[{"kind":"complex-function","description":"(anonymous) in extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Achievements.kt: complexity 32, 100 lines","ref":"extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Achievements.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Achievements.kt#L72","weight":0.5333333333333333},{"kind":"complex-function","description":"problem in engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/StateValidator.kt: complexity 31, 37 lines","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/StateValidator.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/StateValidator.kt#L12","weight":0.5166666666666667},{"kind":"complex-function","description":"common in extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Fortunes.kt: complexity 30, 31 lines","ref":"extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Fortunes.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Fortunes.kt#L72","weight":0.5},{"kind":"complex-function","description":"winLine in extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Fortunes.kt: complexity 27, 20 lines","ref":"extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Fortunes.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Fortunes.kt#L313","weight":0.45},{"kind":"complex-function","description":"holiday in extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Greetings.kt: complexity 27, 20 lines","ref":"extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Greetings.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/extras/src/main/kotlin/io/github/thomasvanriel/solitaire/extras/Greetings.kt#L38","weight":0.45},{"kind":"complex-function","description":"freeCellMoves in engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/Rules.kt: complexity 26, 40 lines","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/Rules.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/Rules.kt#L132","weight":0.43333333333333335},{"kind":"complex-function","description":"of in app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/MoveAnimation.kt: complexity 25, 97 lines","ref":"app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/MoveAnimation.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/MoveAnimation.kt#L53","weight":0.4166666666666667},{"kind":"complex-function","description":"StatsScreen in app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/StatsScreen.kt: complexity 23, 171 lines","ref":"app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/StatsScreen.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/StatsScreen.kt#L62","weight":0.38333333333333336},{"kind":"complex-function","description":"chooseMove in engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/difficulty/RunGamePlayer.kt: complexity 22, 43 lines","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/difficulty/RunGamePlayer.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/difficulty/RunGamePlayer.kt#L64","weight":0.36666666666666664},{"kind":"complex-function","description":"generateSpider in engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt: complexity 21, 39 lines","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt#L183","weight":0.35}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":6058.0,"duplicated_lines":472.0,"duplicated_share":0.0779,"files":58.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/StatsScreen.kt:146 and app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/StatsScreen.kt:163","ref":"app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/StatsScreen.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/app/src/main/kotlin/io/github/thomasvanriel/solitaire/ui/StatsScreen.kt#L146","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: engine/build.gradle.kts:8 and extras/build.gradle.kts:8","ref":"engine/build.gradle.kts","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/build.gradle.kts#L8","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/difficulty/OpenGamePlayer.kt:32 and engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/difficulty/RunGamePlayer.kt:34","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/difficulty/OpenGamePlayer.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/difficulty/OpenGamePlayer.kt#L32","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/Rules.kt:150 and engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/Rules.kt:184","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/Rules.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/rules/Rules.kt#L150","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/OpenGameSolver.kt:29 and engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt:30","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/OpenGameSolver.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/OpenGameSolver.kt#L29","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/OpenGameSolver.kt:102 and engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/Solver.kt:107","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/OpenGameSolver.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/OpenGameSolver.kt#L102","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt:43 and engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/Solver.kt:40","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt#L43","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt:184 and engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt:248","ref":"engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt","url":"https://github.com/ThomasVanRiel/solitaire/blob/bfadd9d50dcce08fff6e3ef19e4eb1cafa7d6f7e/engine/src/main/kotlin/io/github/thomasvanriel/solitaire/engine/solver/RunGameSolver.kt#L184","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":9.0,"weighted_findings":2.25,"scanned_lines":8622.0,"category:correctness":9.0},"findings":[{"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":"tools/screenshot.sh","line":17,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:tools/screenshot.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":"tools/screenshot.sh","line":18,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:tools/screenshot.sh:18"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-command-substitution-in-command","severity":"low","message":"The result of command substitution $(...) or `...`, if unquoted, is split on whitespace or other separators specified by the IFS variable. You should surround it with double quotes to avoid splitting the result.","path":"tools/screenshot.sh","line":20,"fingerprint":"bash.lang.correctness.unquoted-command-substitution-in-command:tools/screenshot.sh:20"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-command-substitution-in-command","severity":"low","message":"The result of command substitution $(...) or `...`, if unquoted, is split on whitespace or other separators specified by the IFS variable. You should surround it with double quotes to avoid splitting the result.","path":"tools/screenshot.sh","line":22,"fingerprint":"bash.lang.correctness.unquoted-command-substitution-in-command:tools/screenshot.sh:22"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-command-substitution-in-command","severity":"low","message":"The result of command substitution $(...) or `...`, if unquoted, is split on whitespace or other separators specified by the IFS variable. You should surround it with double quotes to avoid splitting the result.","path":"tools/screenshot.sh","line":24,"fingerprint":"bash.lang.correctness.unquoted-command-substitution-in-command:tools/screenshot.sh:24"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-command-substitution-in-command","severity":"low","message":"The result of command substitution $(...) or `...`, if unquoted, is split on whitespace or other separators specified by the IFS variable. You should surround it with double quotes to avoid splitting the result.","path":"tools/screenshot.sh","line":24,"fingerprint":"bash.lang.correctness.unquoted-command-substitution-in-command:tools/screenshot.sh:24"},{"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":"tools/screenshot.sh","line":30,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:tools/screenshot.sh:30"},{"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":"tools/screenshot.sh","line":32,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:tools/screenshot.sh:32"},{"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":"tools/screenshot.sh","line":36,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:tools/screenshot.sh:36"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.4772,"check:ci_present":1.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":1.0,"test_lines":2057.0,"source_lines":8622.0,"test_ratio":0.2386,"ci_files":1.0,"cochange_share":0.4048,"cochange_commits":42.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/ci.yml","ref":".github/workflows/ci.yml","url":null,"weight":0.0}],"data":{"test_commands":[],"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":209.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":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":8622.0,"other_lines":0.0,"files_blamed":58.0,"blame_failures":0.0,"quality:ai_findings":9.0,"quality:ai_per_kloc":1.044,"quality:other_findings":0.0,"security:ai_findings":0.0,"security:ai_per_kloc":0.0,"security:other_findings":0.0},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":[]}