{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T15:13:42.554806Z","repo":{"ref":{"host":"github.com","owner":"Anuken","name":"Mindustry"},"default_branch":"master","clone_url":"https://github.com/Anuken/Mindustry.git","html_url":"https://github.com/Anuken/Mindustry","description":"The automation tower defense RTS","stars":29837,"forks":3881,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":2013777,"primary_language":"Java","license_spdx":"GPL-3.0","created_at":"2017-04-30T01:24:29Z","pushed_at":"2026-11-04T20:39:10Z","security_policy_url":null,"distribution":{"owner_created_at":"2014-12-06T18:57:02Z","owner_type":"User","release_assets":[{"name":"assets.jar","size":35390558,"download_count":2156,"release_tag":"v160.7","url":"https://github.com/Anuken/Mindustry/releases/download/v160.7/assets.jar"},{"name":"dependencies.jar","size":15442202,"download_count":3416,"release_tag":"v160.7","url":"https://github.com/Anuken/Mindustry/releases/download/v160.7/dependencies.jar"},{"name":"Mindustry.jar","size":88677884,"download_count":19644,"release_tag":"v160.7","url":"https://github.com/Anuken/Mindustry/releases/download/v160.7/Mindustry.jar"},{"name":"server-release.jar","size":19453000,"download_count":7447,"release_tag":"v160.7","url":"https://github.com/Anuken/Mindustry/releases/download/v160.7/server-release.jar"},{"name":"assets.jar","size":35397287,"download_count":237,"release_tag":"v160.6","url":"https://github.com/Anuken/Mindustry/releases/download/v160.6/assets.jar"},{"name":"dependencies.jar","size":15451837,"download_count":267,"release_tag":"v160.6","url":"https://github.com/Anuken/Mindustry/releases/download/v160.6/dependencies.jar"},{"name":"Mindustry.jar","size":88681189,"download_count":720,"release_tag":"v160.6","url":"https://github.com/Anuken/Mindustry/releases/download/v160.6/Mindustry.jar"},{"name":"server-release.jar","size":19462636,"download_count":484,"release_tag":"v160.6","url":"https://github.com/Anuken/Mindustry/releases/download/v160.6/server-release.jar"},{"name":"assets.jar","size":35610136,"download_count":1163,"release_tag":"v160.5","url":"https://github.com/Anuken/Mindustry/releases/download/v160.5/assets.jar"},{"name":"dependencies.jar","size":15413383,"download_count":2002,"release_tag":"v160.5","url":"https://github.com/Anuken/Mindustry/releases/download/v160.5/dependencies.jar"},{"name":"Mindustry.jar","size":88902250,"download_count":9834,"release_tag":"v160.5","url":"https://github.com/Anuken/Mindustry/releases/download/v160.5/Mindustry.jar"},{"name":"server-release.jar","size":19424950,"download_count":3307,"release_tag":"v160.5","url":"https://github.com/Anuken/Mindustry/releases/download/v160.5/server-release.jar"},{"name":"assets.jar","size":35610336,"download_count":500,"release_tag":"v160.4","url":"https://github.com/Anuken/Mindustry/releases/download/v160.4/assets.jar"},{"name":"dependencies.jar","size":15407198,"download_count":656,"release_tag":"v160.4","url":"https://github.com/Anuken/Mindustry/releases/download/v160.4/dependencies.jar"},{"name":"Mindustry.jar","size":87044493,"download_count":3508,"release_tag":"v160.4","url":"https://github.com/Anuken/Mindustry/releases/download/v160.4/Mindustry.jar"},{"name":"server-release.jar","size":19421337,"download_count":792,"release_tag":"v160.4","url":"https://github.com/Anuken/Mindustry/releases/download/v160.4/server-release.jar"},{"name":"assets.jar","size":35603597,"download_count":165,"release_tag":"v160.3","url":"https://github.com/Anuken/Mindustry/releases/download/v160.3/assets.jar"},{"name":"dependencies.jar","size":15406468,"download_count":260,"release_tag":"v160.3","url":"https://github.com/Anuken/Mindustry/releases/download/v160.3/dependencies.jar"},{"name":"Mindustry.jar","size":87031418,"download_count":1163,"release_tag":"v160.3","url":"https://github.com/Anuken/Mindustry/releases/download/v160.3/Mindustry.jar"},{"name":"server-release.jar","size":19420865,"download_count":198,"release_tag":"v160.3","url":"https://github.com/Anuken/Mindustry/releases/download/v160.3/server-release.jar"},{"name":"assets.jar","size":35603166,"download_count":90,"release_tag":"v160.2","url":"https://github.com/Anuken/Mindustry/releases/download/v160.2/assets.jar"},{"name":"dependencies.jar","size":15405823,"download_count":125,"release_tag":"v160.2","url":"https://github.com/Anuken/Mindustry/releases/download/v160.2/dependencies.jar"},{"name":"Mindustry.jar","size":87022576,"download_count":634,"release_tag":"v160.2","url":"https://github.com/Anuken/Mindustry/releases/download/v160.2/Mindustry.jar"},{"name":"server-release.jar","size":19420512,"download_count":214,"release_tag":"v160.2","url":"https://github.com/Anuken/Mindustry/releases/download/v160.2/server-release.jar"},{"name":"assets.jar","size":35603070,"download_count":197,"release_tag":"v160.1","url":"https://github.com/Anuken/Mindustry/releases/download/v160.1/assets.jar"},{"name":"dependencies.jar","size":15404811,"download_count":1736,"release_tag":"v160.1","url":"https://github.com/Anuken/Mindustry/releases/download/v160.1/dependencies.jar"},{"name":"Mindustry.jar","size":87033822,"download_count":1822,"release_tag":"v160.1","url":"https://github.com/Anuken/Mindustry/releases/download/v160.1/Mindustry.jar"},{"name":"server-release.jar","size":19419876,"download_count":317,"release_tag":"v160.1","url":"https://github.com/Anuken/Mindustry/releases/download/v160.1/server-release.jar"},{"name":"assets.jar","size":35605427,"download_count":76,"release_tag":"v160","url":"https://github.com/Anuken/Mindustry/releases/download/v160/assets.jar"},{"name":"dependencies.jar","size":15402174,"download_count":4772,"release_tag":"v160","url":"https://github.com/Anuken/Mindustry/releases/download/v160/dependencies.jar"},{"name":"Mindustry.jar","size":87039071,"download_count":747,"release_tag":"v160","url":"https://github.com/Anuken/Mindustry/releases/download/v160/Mindustry.jar"},{"name":"server-release.jar","size":19419288,"download_count":431,"release_tag":"v160","url":"https://github.com/Anuken/Mindustry/releases/download/v160/server-release.jar"},{"name":"assets.jar","size":35281991,"download_count":3265,"release_tag":"v159.7","url":"https://github.com/Anuken/Mindustry/releases/download/v159.7/assets.jar"},{"name":"dependencies.jar","size":15255490,"download_count":8787,"release_tag":"v159.7","url":"https://github.com/Anuken/Mindustry/releases/download/v159.7/dependencies.jar"},{"name":"Mindustry.jar","size":86634761,"download_count":22567,"release_tag":"v159.7","url":"https://github.com/Anuken/Mindustry/releases/download/v159.7/Mindustry.jar"},{"name":"server-release.jar","size":19158443,"download_count":5364,"release_tag":"v159.7","url":"https://github.com/Anuken/Mindustry/releases/download/v159.7/server-release.jar"},{"name":"assets.jar","size":35279638,"download_count":480,"release_tag":"v159.6","url":"https://github.com/Anuken/Mindustry/releases/download/v159.6/assets.jar"},{"name":"dependencies.jar","size":15250895,"download_count":458,"release_tag":"v159.6","url":"https://github.com/Anuken/Mindustry/releases/download/v159.6/dependencies.jar"},{"name":"Mindustry.jar","size":86624922,"download_count":2864,"release_tag":"v159.6","url":"https://github.com/Anuken/Mindustry/releases/download/v159.6/Mindustry.jar"},{"name":"server-release.jar","size":19155189,"download_count":672,"release_tag":"v159.6","url":"https://github.com/Anuken/Mindustry/releases/download/v159.6/server-release.jar"}]}},"commit_sha":"1a22b880576d2f8f97550280f76bfdd0d0069543","profile":{"lines_by_language":{"Java":185760,"JavaScript":285,"Shell":17},"files_by_category":{"binary":2859,"source":865,"config":269,"other":185,"docs":60,"oversized":17,"test":10},"source_lines":183227,"test_lines":2835},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.65,"coverage":1.0,"label":"possible","breakdown":{"attributed_share":0.0001,"suspected_share":0.0023,"estimated_share":0.0001,"ai_artifacts":0.0,"flagged_work_units":1.0,"flagged_releases":0.0,"style_index":0.016},"summary":"Weak signals consistent with AI-assisted development. 2 commit(s) carry explicit AI attribution, too few to characterize the codebase."},"quality":{"score":63.7,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":35.8,"duplication":78.2,"lint":86.4,"testing":56.8,"docs":80.0,"type_safety":null,"process":65.0},"summary":"Code quality is weak: test-to-source ratio 0.02, CI runs tests; 34% of function code in complex or long functions; 4% duplicated lines. Weakest area: complexity."},"security":{"score":54.5,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":81.9,"sast":99.5,"dependencies":null,"ci_actions":4.7,"posture":0.0,"scorecard":25.0},"summary":"Security posture is weak: 0 possible secret(s) in the tree, 1 only in history; 15 high-severity workflow issues. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"ok","tool_version":"scorecard v5.6.0","metrics":{"aggregate":3.7,"check:Dangerous-Workflow":10.0,"check:Maintained":10.0,"check:Code-Review":3.0,"check:Token-Permissions":0.0,"check:CII-Best-Practices":0.0,"check:Security-Policy":0.0,"check:Pinned-Dependencies":0.0,"check:License":10.0,"check:Fuzzing":0.0,"check:Signed-Releases":0.0,"check:Branch-Protection":0.0,"check:SAST":0.0,"check:Binary-Artifacts":10.0},"findings":[],"evidence":[{"kind":"scorecard-check","description":"Scorecard Dangerous-Workflow: 10/10 (no dangerous workflow patterns detected)","ref":"Dangerous-Workflow","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Maintained: 10/10 (30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10)","ref":"Maintained","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Code-Review: 3/10 (Found 11/30 approved changesets -- score normalized to 3)","ref":"Code-Review","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":0.7},{"kind":"scorecard-check","description":"Scorecard Token-Permissions: 0/10 (detected GitHub workflow tokens with excessive permissions)","ref":"Token-Permissions","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":1.0},{"kind":"scorecard-check","description":"Scorecard CII-Best-Practices: 0/10 (no effort to earn an OpenSSF best practices badge detected)","ref":"CII-Best-Practices","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":1.0},{"kind":"scorecard-check","description":"Scorecard Security-Policy: 0/10 (security policy file not detected)","ref":"Security-Policy","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":1.0},{"kind":"scorecard-check","description":"Scorecard Pinned-Dependencies: 0/10 (dependency not pinned by hash detected -- score normalized to 0)","ref":"Pinned-Dependencies","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":1.0},{"kind":"scorecard-check","description":"Scorecard License: 10/10 (license file detected)","ref":"License","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":0.0},{"kind":"scorecard-check","description":"Scorecard Fuzzing: 0/10 (project is not fuzzed)","ref":"Fuzzing","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":1.0},{"kind":"scorecard-check","description":"Scorecard Signed-Releases: 0/10 (Project has not signed or included provenance with any releases.)","ref":"Signed-Releases","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":1.0},{"kind":"scorecard-check","description":"Scorecard Branch-Protection: 0/10 (branch protection not enabled on development/release branches)","ref":"Branch-Protection","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":1.0},{"kind":"scorecard-check","description":"Scorecard SAST: 0/10 (SAST tool is not run on all commits -- score normalized to 0)","ref":"SAST","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":1.0},{"kind":"scorecard-check","description":"Scorecard Binary-Artifacts: 10/10 (no binaries found in the repo)","ref":"Binary-Artifacts","url":"https://scorecard.dev/viewer/?uri=github.com/Anuken/Mindustry","weight":0.0}],"data":{"date":"2026-11-09","commit":"1a22b880576d2f8f97550280f76bfdd0d0069543","matches_head":true},"error":null},{"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":18350.0,"attributed_commits":2.0,"attributed_commit_share":0.00010899182561307902,"effective_loc":549712.0,"attributed_loc":45.0,"attributed_loc_share":0.00008186104723928165,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"GitHub Copilot coding agent: 2 attributed commits, 45 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"8713c41741661c460d034fc5f408280d655259d7","url":"https://github.com/Anuken/Mindustry/commit/8713c41741661c460d034fc5f408280d655259d7","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"67c06d167d28459cd7101464ab35e41b95a57758","url":"https://github.com/Anuken/Mindustry/commit/67c06d167d28459cd7101464ab35e41b95a57758","weight":0.9}],"data":{"attributed_loc_by_commit":{"67c06d167d28459cd7101464ab35e41b95a57758":0,"8713c41741661c460d034fc5f408280d655259d7":45},"tools":{"github-copilot":{"name":"GitHub Copilot coding agent","commits":2,"loc":45,"first_seen":1776013181,"last_seen":1784342526}},"monthly":{"2017-04":{"loc":3505,"attributed_loc":0},"2017-05":{"loc":3202,"attributed_loc":0},"2017-06":{"loc":637,"attributed_loc":0},"2017-07":{"loc":593,"attributed_loc":0},"2017-08":{"loc":1275,"attributed_loc":0},"2017-09":{"loc":2907,"attributed_loc":0},"2017-10":{"loc":3397,"attributed_loc":0},"2017-11":{"loc":5988,"attributed_loc":0},"2017-12":{"loc":12549,"attributed_loc":0},"2018-01":{"loc":17361,"attributed_loc":0},"2018-02":{"loc":4951,"attributed_loc":0},"2018-03":{"loc":13966,"attributed_loc":0},"2018-04":{"loc":11882,"attributed_loc":0},"2018-05":{"loc":14144,"attributed_loc":0},"2018-06":{"loc":20461,"attributed_loc":0},"2018-07":{"loc":28615,"attributed_loc":0},"2018-08":{"loc":6544,"attributed_loc":0},"2018-09":{"loc":6765,"attributed_loc":0},"2018-10":{"loc":4838,"attributed_loc":0},"2018-11":{"loc":6132,"attributed_loc":0},"2018-12":{"loc":8033,"attributed_loc":0},"2019-01":{"loc":12969,"attributed_loc":0},"2019-02":{"loc":6640,"attributed_loc":0},"2019-03":{"loc":7712,"attributed_loc":0},"2019-04":{"loc":6358,"attributed_loc":0},"2019-05":{"loc":4089,"attributed_loc":0},"2019-06":{"loc":5254,"attributed_loc":0},"2019-07":{"loc":3652,"attributed_loc":0},"2019-08":{"loc":9558,"attributed_loc":0},"2019-09":{"loc":8796,"attributed_loc":0},"2019-10":{"loc":8300,"attributed_loc":0},"2019-11":{"loc":4912,"attributed_loc":0},"2019-12":{"loc":11305,"attributed_loc":0},"2020-01":{"loc":7537,"attributed_loc":0},"2020-02":{"loc":20245,"attributed_loc":0},"2020-03":{"loc":9960,"attributed_loc":0},"2020-04":{"loc":4118,"attributed_loc":0},"2020-05":{"loc":17508,"attributed_loc":0},"2020-06":{"loc":10239,"attributed_loc":0},"2020-07":{"loc":7703,"attributed_loc":0},"2020-08":{"loc":10418,"attributed_loc":0},"2020-09":{"loc":7557,"attributed_loc":0},"2020-10":{"loc":9245,"attributed_loc":0},"2020-11":{"loc":6024,"attributed_loc":0},"2020-12":{"loc":2418,"attributed_loc":0},"2021-01":{"loc":1231,"attributed_loc":0},"2021-02":{"loc":2844,"attributed_loc":0},"2021-03":{"loc":1092,"attributed_loc":0},"2021-04":{"loc":185,"attributed_loc":0},"2021-05":{"loc":178,"attributed_loc":0},"2021-06":{"loc":17125,"attributed_loc":0},"2021-07":{"loc":2962,"attributed_loc":0},"2021-08":{"loc":2960,"attributed_loc":0},"2021-09":{"loc":1945,"attributed_loc":0},"2021-10":{"loc":3766,"attributed_loc":0},"2021-11":{"loc":7303,"attributed_loc":0},"2021-12":{"loc":6627,"attributed_loc":0},"2022-01":{"loc":3428,"attributed_loc":0},"2022-02":{"loc":15245,"attributed_loc":0},"2022-03":{"loc":2133,"attributed_loc":0},"2022-04":{"loc":4848,"attributed_loc":0},"2022-05":{"loc":3811,"attributed_loc":0},"2022-06":{"loc":3142,"attributed_loc":0},"2022-07":{"loc":4249,"attributed_loc":0},"2022-08":{"loc":1415,"attributed_loc":0},"2022-09":{"loc":1065,"attributed_loc":0},"2022-10":{"loc":2065,"attributed_loc":0},"2022-11":{"loc":513,"attributed_loc":0},"2022-12":{"loc":91,"attributed_loc":0},"2023-01":{"loc":718,"attributed_loc":0},"2023-02":{"loc":645,"attributed_loc":0},"2023-03":{"loc":891,"attributed_loc":0},"2023-04":{"loc":814,"attributed_loc":0},"2023-05":{"loc":1965,"attributed_loc":0},"2023-06":{"loc":951,"attributed_loc":0},"2023-07":{"loc":283,"attributed_loc":0},"2023-08":{"loc":1018,"attributed_loc":0},"2023-09":{"loc":2789,"attributed_loc":0},"2023-10":{"loc":526,"attributed_loc":0},"2023-11":{"loc":3175,"attributed_loc":0},"2023-12":{"loc":1722,"attributed_loc":0},"2024-01":{"loc":878,"attributed_loc":0},"2024-02":{"loc":576,"attributed_loc":0},"2024-03":{"loc":895,"attributed_loc":0},"2024-04":{"loc":2909,"attributed_loc":0},"2024-05":{"loc":761,"attributed_loc":0},"2024-06":{"loc":1513,"attributed_loc":0},"2024-07":{"loc":349,"attributed_loc":0},"2024-08":{"loc":514,"attributed_loc":0},"2024-09":{"loc":1171,"attributed_loc":0},"2024-10":{"loc":1543,"attributed_loc":0},"2024-11":{"loc":332,"attributed_loc":0},"2024-12":{"loc":106,"attributed_loc":0},"2025-01":{"loc":2337,"attributed_loc":0},"2025-02":{"loc":2787,"attributed_loc":0},"2025-03":{"loc":3,"attributed_loc":0},"2025-04":{"loc":4746,"attributed_loc":0},"2025-05":{"loc":2273,"attributed_loc":0},"2025-06":{"loc":846,"attributed_loc":0},"2025-07":{"loc":3428,"attributed_loc":0},"2025-08":{"loc":667,"attributed_loc":0},"2025-09":{"loc":1504,"attributed_loc":0},"2025-10":{"loc":2296,"attributed_loc":0},"2025-11":{"loc":1157,"attributed_loc":0},"2025-12":{"loc":2427,"attributed_loc":0},"2026-01":{"loc":794,"attributed_loc":0},"2026-02":{"loc":1854,"attributed_loc":0},"2026-03":{"loc":2552,"attributed_loc":0},"2026-04":{"loc":1514,"attributed_loc":0},"2026-05":{"loc":3258,"attributed_loc":0},"2026-06":{"loc":5804,"attributed_loc":0},"2026-07":{"loc":3510,"attributed_loc":45},"2026-08":{"loc":5333,"attributed_loc":0},"2026-09":{"loc":2965,"attributed_loc":0},"2026-10":{"loc":127,"attributed_loc":0},"2026-11":{"loc":1,"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":8975.0,"flagged_units":1.0,"pre_ai_era_bursts":12.0,"pre_ai_era_measured_loc":359926.0,"pre_ai_era_burst_loc":24693.0,"measured_loc":506778.0,"flagged_loc":1283.0,"flagged_loc_share":0.0025316805386184876,"max_loc_per_hour":2308.4156729131178,"median_loc_per_hour":54.16153124418541,"pr_timed_units":783.0,"excluded_import_loc":42934.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"1,283 lines of first-party code in ~1.5h (829 lines/hour, 2 commit session)","ref":"3a7d7647d98ea5e53eba2f64440b8e713d4789ac","url":"https://github.com/Anuken/Mindustry/commit/3a7d7647d98ea5e53eba2f64440b8e713d4789ac","weight":0.24881307236487699}],"data":{"flagged_loc_by_commit":{"1ac1263aa4b3bba6a0a2b3aa677cb6a2a1c58704":10,"3a7d7647d98ea5e53eba2f64440b8e713d4789ac":1273},"excluded_import_commits":["28b235ef07be92808cdba260168ff314db426376","514d4817c8fdc38f43f85ec73fd8bd3d55cef9db","74e0680841e0d235caf1d2b1a4ac6da64c50a40c","b9aa8edf780cfc57cd41a88dd60cb734ce103208","baaeb229cf97205d73fe9fb93c15198e9a5d6194"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-5","metrics":{"releases":99.0,"flagged_releases":0.0,"max_loc_per_day":519.7},"findings":[],"evidence":[],"data":{"releases":[{"from":"v121.3","to":"v121.4","loc":73,"days":0.64,"loc_per_day":114.4,"flagged":false},{"from":"v121.4","to":"v122","loc":922,"days":7.93,"loc_per_day":116.3,"flagged":false},{"from":"v122","to":"v122.1","loc":497,"days":6.3,"loc_per_day":78.9,"flagged":false},{"from":"v122.1","to":"v123","loc":1015,"days":21.75,"loc_per_day":46.7,"flagged":false},{"from":"v123","to":"v123.1","loc":33,"days":0.79,"loc_per_day":41.6,"flagged":false},{"from":"v123.1","to":"v124","loc":893,"days":17.19,"loc_per_day":52.0,"flagged":false},{"from":"v124","to":"v124.1","loc":22,"days":0.89,"loc_per_day":24.8,"flagged":false},{"from":"v124.1","to":"v125","loc":1086,"days":8.1,"loc_per_day":134.0,"flagged":false},{"from":"v125","to":"v125.1","loc":606,"days":3.22,"loc_per_day":188.0,"flagged":false},{"from":"v125.1","to":"v126","loc":786,"days":13.83,"loc_per_day":56.8,"flagged":false},{"from":"v126","to":"v126.1","loc":18,"days":0.33,"loc_per_day":55.2,"flagged":false},{"from":"v126.1","to":"v126.2","loc":787,"days":23.43,"loc_per_day":33.6,"flagged":false},{"from":"v126.2","to":"v127","loc":3754,"days":88.17,"loc_per_day":42.6,"flagged":false},{"from":"v127","to":"v127.1","loc":56,"days":0.89,"loc_per_day":62.6,"flagged":false},{"from":"v127.1","to":"v127.2","loc":132,"days":4.09,"loc_per_day":32.3,"flagged":false},{"from":"v127.2","to":"v128","loc":454,"days":12.09,"loc_per_day":37.5,"flagged":false},{"from":"v128","to":"v128.1","loc":335,"days":5.15,"loc_per_day":65.0,"flagged":false},{"from":"v128.1","to":"v129","loc":1361,"days":10.92,"loc_per_day":124.6,"flagged":false},{"from":"v129","to":"v129.1","loc":3,"days":0.04,"loc_per_day":72.0,"flagged":false},{"from":"v129.1","to":"v129.2","loc":347,"days":7.05,"loc_per_day":49.2,"flagged":false},{"from":"v129.2","to":"v130","loc":1108,"days":11.75,"loc_per_day":94.3,"flagged":false},{"from":"v130","to":"v130.1","loc":672,"days":7.06,"loc_per_day":95.1,"flagged":false},{"from":"v130.1","to":"v131","loc":868,"days":20.23,"loc_per_day":42.9,"flagged":false},{"from":"v131","to":"v132","loc":2709,"days":33.77,"loc_per_day":80.2,"flagged":false},{"from":"v132","to":"v133","loc":74,"days":1.03,"loc_per_day":72.0,"flagged":false},{"from":"v133","to":"v134","loc":711,"days":9.84,"loc_per_day":72.3,"flagged":false},{"from":"v134","to":"v134.1","loc":176,"days":4.92,"loc_per_day":35.8,"flagged":false},{"from":"v134.1","to":"v135","loc":281,"days":24.14,"loc_per_day":11.6,"flagged":false},{"from":"v135","to":"v135.1","loc":463,"days":125.84,"loc_per_day":3.7,"flagged":false},{"from":"v135.1","to":"v135.2","loc":0,"days":1.26,"loc_per_day":0.0,"flagged":false},{"from":"v135.2","to":"v136","loc":54680,"days":105.21,"loc_per_day":519.7,"flagged":false},{"from":"v136","to":"v136.1","loc":152,"days":3.08,"loc_per_day":49.4,"flagged":false},{"from":"v136.1","to":"v137","loc":1221,"days":16.66,"loc_per_day":73.3,"flagged":false},{"from":"v137","to":"v138","loc":715,"days":24.98,"loc_per_day":28.6,"flagged":false},{"from":"v138","to":"v139","loc":1549,"days":36.16,"loc_per_day":42.8,"flagged":false},{"from":"v139","to":"v140","loc":1702,"days":27.35,"loc_per_day":62.2,"flagged":false},{"from":"v140","to":"v140.1","loc":176,"days":2.4,"loc_per_day":73.3,"flagged":false},{"from":"v140.1","to":"v140.2","loc":186,"days":5.46,"loc_per_day":34.0,"flagged":false},{"from":"v140.2","to":"v140.3","loc":62,"days":2.36,"loc_per_day":26.3,"flagged":false},{"from":"v140.3","to":"v140.4","loc":47,"days":2.16,"loc_per_day":21.8,"flagged":false},{"from":"v140.4","to":"v141","loc":613,"days":60.06,"loc_per_day":10.2,"flagged":false},{"from":"v141","to":"v141.1","loc":16,"days":0.13,"loc_per_day":123.5,"flagged":false},{"from":"v141.1","to":"v141.2","loc":69,"days":0.8,"loc_per_day":85.9,"flagged":false},{"from":"v141.2","to":"v141.3","loc":113,"days":9.05,"loc_per_day":12.5,"flagged":false},{"from":"v141.3","to":"v142","loc":590,"days":29.99,"loc_per_day":19.7,"flagged":false},{"from":"v142","to":"v143","loc":971,"days":38.47,"loc_per_day":25.2,"flagged":false},{"from":"v143","to":"v143.1","loc":422,"days":7.49,"loc_per_day":56.3,"flagged":false},{"from":"v143.1","to":"v144","loc":1266,"days":33.19,"loc_per_day":38.1,"flagged":false},{"from":"v144","to":"v144.1","loc":17,"days":0.45,"loc_per_day":38.2,"flagged":false},{"from":"v144.1","to":"v144.2","loc":828,"days":9.78,"loc_per_day":84.7,"flagged":false},{"from":"v144.2","to":"v144.3","loc":16,"days":1.05,"loc_per_day":15.3,"flagged":false},{"from":"v144.3","to":"v145","loc":966,"days":25.84,"loc_per_day":37.4,"flagged":false},{"from":"v145","to":"v145.1","loc":57,"days":1.98,"loc_per_day":28.8,"flagged":false},{"from":"v145.1","to":"v146","loc":1683,"days":76.19,"loc_per_day":22.1,"flagged":false},{"from":"v146","to":"v147","loc":27539,"days":584.95,"loc_per_day":47.1,"flagged":false},{"from":"v147","to":"v147.1","loc":156,"days":3.08,"loc_per_day":50.6,"flagged":false},{"from":"v147.1","to":"v148","loc":654,"days":7.45,"loc_per_day":87.8,"flagged":false},{"from":"v148","to":"v149","loc":1070,"days":9.4,"loc_per_day":113.9,"flagged":false},{"from":"v149","to":"v150","loc":6045,"days":83.72,"loc_per_day":72.2,"flagged":false},{"from":"v150","to":"v150.1","loc":135,"days":2.17,"loc_per_day":62.3,"flagged":false},{"from":"v150.1","to":"v151","loc":903,"days":30.09,"loc_per_day":30.0,"flagged":false},{"from":"v151","to":"v151.1","loc":16,"days":0.85,"loc_per_day":18.9,"flagged":false},{"from":"v151.1","to":"v152","loc":1492,"days":32.41,"loc_per_day":46.0,"flagged":false},{"from":"v152","to":"v152.1","loc":52,"days":1.42,"loc_per_day":36.5,"flagged":false},{"from":"v152.1","to":"v152.2","loc":69,"days":0.92,"loc_per_day":75.2,"flagged":false},{"from":"v152.2","to":"v153","loc":2224,"days":31.19,"loc_per_day":71.3,"flagged":false},{"from":"v153","to":"v154","loc":2294,"days":47.21,"loc_per_day":48.6,"flagged":false},{"from":"v154","to":"v154.2","loc":27,"days":1.07,"loc_per_day":25.2,"flagged":false},{"from":"v154.2","to":"v154.3","loc":132,"days":3.62,"loc_per_day":36.5,"flagged":false},{"from":"v154.3","to":"v155","loc":2451,"days":49.53,"loc_per_day":49.5,"flagged":false},{"from":"v155","to":"v155.1","loc":157,"days":1.51,"loc_per_day":104.0,"flagged":false},{"from":"v155.1","to":"v155.2","loc":205,"days":1.39,"loc_per_day":147.0,"flagged":false},{"from":"v155.2","to":"v155.3","loc":21,"days":1.63,"loc_per_day":12.9,"flagged":false},{"from":"v155.3","to":"v155.4","loc":267,"days":3.06,"loc_per_day":87.2,"flagged":false},{"from":"v155.4","to":"v156","loc":2748,"days":35.07,"loc_per_day":78.4,"flagged":false},{"from":"v156","to":"v156.1","loc":145,"days":1.84,"loc_per_day":78.9,"flagged":false},{"from":"v156.1","to":"v156.2","loc":45,"days":2.05,"loc_per_day":22.0,"flagged":false},{"from":"v156.2","to":"v157","loc":413,"days":12.36,"loc_per_day":33.4,"flagged":false},{"from":"v157","to":"v157.1","loc":100,"days":5.81,"loc_per_day":17.2,"flagged":false},{"from":"v157.1","to":"v157.2","loc":4,"days":0.85,"loc_per_day":4.7,"flagged":false},{"from":"v157.2","to":"v157.3","loc":269,"days":2.31,"loc_per_day":116.2,"flagged":false},{"from":"v157.3","to":"v157.4","loc":291,"days":4.01,"loc_per_day":72.5,"flagged":false},{"from":"v157.4","to":"v158","loc":957,"days":31.88,"loc_per_day":30.0,"flagged":false},{"from":"v158","to":"v158.1","loc":56,"days":1.07,"loc_per_day":52.4,"flagged":false},{"from":"v158.1","to":"v159","loc":9459,"days":42.93,"loc_per_day":220.3,"flagged":false},{"from":"v159","to":"v159.1","loc":86,"days":0.63,"loc_per_day":137.1,"flagged":false},{"from":"v159.1","to":"v159.2","loc":71,"days":1.0,"loc_per_day":70.9,"flagged":false},{"from":"v159.2","to":"v159.3","loc":1298,"days":2.98,"loc_per_day":435.3,"flagged":false},{"from":"v159.3","to":"v159.5","loc":175,"days":2.18,"loc_per_day":80.3,"flagged":false},{"from":"v159.5","to":"v159.6","loc":46,"days":1.37,"loc_per_day":33.5,"flagged":false},{"from":"v159.6","to":"v159.7","loc":309,"days":4.79,"loc_per_day":64.5,"flagged":false},{"from":"v159.7","to":"v160","loc":8648,"days":53.15,"loc_per_day":162.7,"flagged":false},{"from":"v160","to":"v160.1","loc":41,"days":0.23,"loc_per_day":174.8,"flagged":false},{"from":"v160.1","to":"v160.2","loc":47,"days":1.42,"loc_per_day":33.2,"flagged":false},{"from":"v160.2","to":"v160.3","loc":49,"days":0.46,"loc_per_day":106.2,"flagged":false},{"from":"v160.3","to":"v160.4","loc":25,"days":0.9,"loc_per_day":27.8,"flagged":false},{"from":"v160.4","to":"v160.5","loc":338,"days":6.5,"loc_per_day":52.0,"flagged":false},{"from":"v160.5","to":"v160.6","loc":161,"days":16.32,"loc_per_day":9.9,"flagged":false},{"from":"v160.6","to":"v160.7","loc":4,"days":1.13,"loc_per_day":3.5,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":183227.0,"index":0.016,"count:narrated_steps":2.0,"per_kloc:narrated_steps":0.011,"files:narrated_steps":2.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.011,"files:emoji_in_code":2.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: //then, if it's shown and the current block 'agrees' to hide, hide it.","ref":"core/src/mindustry/input/InputHandler.java:2006","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/input/InputHandler.java#L2006","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: //first, find a planets associated with the current tech tree","ref":"core/src/mindustry/ui/dialogs/ResearchDialog.java:218","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ui/dialogs/ResearchDialog.java#L218","weight":0.0}],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":1.0,"secrets_nonprod":0.0,"secrets_low_confidence":1.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"core/assets/bundles/bundle_sr.properties","line":1615,"fingerprint":"core/assets/bundles/bundle_sr.properties:generic-api-key:1615"},{"rule_id":"gitleaks/discord-client-id","severity":"medium","message":"Possible discord-client-id secret in history (commit c9f0a59339); removed from the current tree but still retrievable","path":"desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java","line":33,"fingerprint":"c9f0a5933921fa6d2f41a77df33d28cbcc24321a:desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java:discord-client-id:33"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":6.0,"findings_high":0.0,"findings_medium":6.0,"findings_low":0.0,"weighted_findings":2.6,"scanned_lines":183227.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":"android/AndroidManifest.xml","line":23,"fingerprint":"java.android.security.exported_activity:android/AndroidManifest.xml:23"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"core/src/mindustry/maps/MapPreviewLoader.java","line":67,"fingerprint":"java.lang.security.audit.unsafe-reflection:core/src/mindustry/maps/MapPreviewLoader.java:67"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"core/src/mindustry/mod/ContentParser.java","line":1444,"fingerprint":"java.lang.security.audit.unsafe-reflection:core/src/mindustry/mod/ContentParser.java:1444"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"core/src/mindustry/mod/ContentParser.java","line":1448,"fingerprint":"java.lang.security.audit.unsafe-reflection:core/src/mindustry/mod/ContentParser.java:1448"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"core/src/mindustry/mod/Mods.java","line":1191,"fingerprint":"java.lang.security.audit.unsafe-reflection:core/src/mindustry/mod/Mods.java:1191"},{"rule_id":"opengrep/java.lang.security.audit.crypto.unencrypted-socket","severity":"medium","message":"Detected use of a Java socket that is not encrypted. As a result, the traffic could be read by an attacker intercepting the network traffic. Use an SSLSocket created by 'SSLSocketFactory' or 'SSLServerSocketFactory' instead. [confidence high]","path":"server/src/mindustry/server/ServerControl.java","line":1434,"fingerprint":"java.lang.security.audit.crypto.unencrypted-socket:server/src/mindustry/server/ServerControl.java:1434"}],"evidence":[],"data":{"rulesets":["java","javascript","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":4.0,"findings":24.0,"findings_high":15.0,"findings_medium":1.0,"findings_low":8.0,"penalty":183.6},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/deployment.yml","line":17,"fingerprint":"unpinned-uses:.github/workflows/deployment.yml:17"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/deployment.yml","line":19,"fingerprint":"unpinned-uses:.github/workflows/deployment.yml:19"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/deployment.yml","line":64,"fingerprint":"unpinned-uses:.github/workflows/deployment.yml:64"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/deployment.yml","line":70,"fingerprint":"unpinned-uses:.github/workflows/deployment.yml:70"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/deployment.yml","line":77,"fingerprint":"unpinned-uses:.github/workflows/deployment.yml:77"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/deployment.yml","line":85,"fingerprint":"unpinned-uses:.github/workflows/deployment.yml:85"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/gradle-wrapper-validation.yml","line":9,"fingerprint":"unpinned-uses:.github/workflows/gradle-wrapper-validation.yml:9"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/gradle-wrapper-validation.yml","line":10,"fingerprint":"unpinned-uses:.github/workflows/gradle-wrapper-validation.yml:10"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/pr.yml","line":13,"fingerprint":"unpinned-uses:.github/workflows/pr.yml:13"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/pr.yml","line":15,"fingerprint":"unpinned-uses:.github/workflows/pr.yml:15"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/pr.yml","line":22,"fingerprint":"unpinned-uses:.github/workflows/pr.yml:22"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/pr.yml","line":28,"fingerprint":"unpinned-uses:.github/workflows/pr.yml:28"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/push.yml","line":14,"fingerprint":"unpinned-uses:.github/workflows/push.yml:14"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/push.yml","line":25,"fingerprint":"unpinned-uses:.github/workflows/push.yml:25"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/push.yml","line":32,"fingerprint":"unpinned-uses:.github/workflows/push.yml:32"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/gradle-wrapper-validation.yml","line":5,"fingerprint":"excessive-permissions:.github/workflows/gradle-wrapper-validation.yml:5"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/deployment.yml","line":17,"fingerprint":"artipacked:.github/workflows/deployment.yml:17"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/gradle-wrapper-validation.yml","line":9,"fingerprint":"artipacked:.github/workflows/gradle-wrapper-validation.yml:9"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/pr.yml","line":13,"fingerprint":"artipacked:.github/workflows/pr.yml:13"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/push.yml","line":14,"fingerprint":"artipacked:.github/workflows/push.yml:14"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/deployment.yml","line":64,"fingerprint":"superfluous-actions:.github/workflows/deployment.yml:64"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/deployment.yml","line":70,"fingerprint":"superfluous-actions:.github/workflows/deployment.yml:70"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/deployment.yml","line":77,"fingerprint":"superfluous-actions:.github/workflows/deployment.yml:77"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/deployment.yml","line":85,"fingerprint":"superfluous-actions:.github/workflows/deployment.yml:85"}],"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.315,"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":40.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v160.7 ships assets.jar (2156 downloads)","ref":"assets.jar","url":"https://github.com/Anuken/Mindustry/releases/download/v160.7/assets.jar","weight":0.0},{"kind":"binary-release-asset","description":"release v160.7 ships dependencies.jar (3416 downloads)","ref":"dependencies.jar","url":"https://github.com/Anuken/Mindustry/releases/download/v160.7/dependencies.jar","weight":0.0},{"kind":"binary-release-asset","description":"release v160.7 ships Mindustry.jar (19644 downloads)","ref":"Mindustry.jar","url":"https://github.com/Anuken/Mindustry/releases/download/v160.7/Mindustry.jar","weight":0.0},{"kind":"binary-release-asset","description":"release v160.7 ships server-release.jar (7447 downloads)","ref":"server-release.jar","url":"https://github.com/Anuken/Mindustry/releases/download/v160.7/server-release.jar","weight":0.0},{"kind":"binary-release-asset","description":"release v160.6 ships assets.jar (237 downloads)","ref":"assets.jar","url":"https://github.com/Anuken/Mindustry/releases/download/v160.6/assets.jar","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":10022.0,"function_nloc":112611.0,"mean_ccn":3.44,"p90_ccn":7.0,"complex_functions":331.0,"long_functions":81.0,"many_param_functions":94.0,"risky_nloc_share":0.3426},"findings":[],"evidence":[{"kind":"complex-function","description":"EntityProcess::process in annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java: complexity 196, 542 lines","ref":"annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java#L60","weight":1.0},{"kind":"complex-function","description":"Generators::run in tools/src/mindustry/tools/Generators.java: complexity 190, 624 lines","ref":"tools/src/mindustry/tools/Generators.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/tools/src/mindustry/tools/Generators.java#L69","weight":1.0},{"kind":"complex-function","description":"GameService::registerEvents in core/src/mindustry/service/GameService.java: complexity 175, 367 lines","ref":"core/src/mindustry/service/GameService.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/service/GameService.java#L84","weight":1.0},{"kind":"complex-function","description":"ServerControl::registerCommands in server/src/mindustry/server/ServerControl.java: complexity 159, 731 lines","ref":"server/src/mindustry/server/ServerControl.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/server/src/mindustry/server/ServerControl.java#L476","weight":1.0},{"kind":"complex-function","description":"DesktopInput::pollInputPlayer in core/src/mindustry/input/DesktopInput.java: complexity 156, 263 lines","ref":"core/src/mindustry/input/DesktopInput.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/input/DesktopInput.java#L582","weight":1.0},{"kind":"complex-function","description":"DesktopInput::update in core/src/mindustry/input/DesktopInput.java: complexity 146, 244 lines","ref":"core/src/mindustry/input/DesktopInput.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/input/DesktopInput.java#L230","weight":1.0},{"kind":"complex-function","description":"SerpuloPlanetGenerator::generate in core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java: complexity 138, 328 lines","ref":"core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java#L243","weight":1.0},{"kind":"complex-function","description":"CommandAI::defaultBehavior in core/src/mindustry/ai/types/CommandAI.java: complexity 125, 167 lines","ref":"core/src/mindustry/ai/types/CommandAI.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ai/types/CommandAI.java#L199","weight":1.0},{"kind":"complex-function","description":"HudFragment::build in core/src/mindustry/ui/fragments/HudFragment.java: complexity 114, 381 lines","ref":"core/src/mindustry/ui/fragments/HudFragment.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ui/fragments/HudFragment.java#L238","weight":1.0},{"kind":"complex-function","description":"ErekirPlanetGenerator::generate in core/src/mindustry/maps/planet/ErekirPlanetGenerator.java: complexity 107, 219 lines","ref":"core/src/mindustry/maps/planet/ErekirPlanetGenerator.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java#L124","weight":1.0}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":116227.0,"duplicated_lines":4752.0,"duplicated_share":0.0409,"files":865.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: core/assets/scripts/base.js:1 and core/assets/scripts/global.js:3","ref":"core/assets/scripts/base.js","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/assets/scripts/base.js#L1","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: core/src/mindustry/ai/BlockIndexer.java:347 and core/src/mindustry/ai/BlockIndexer.java:373","ref":"core/src/mindustry/ai/BlockIndexer.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ai/BlockIndexer.java#L347","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: core/src/mindustry/ai/ControlPathfinder.java:405 and core/src/mindustry/ai/Pathfinder.java:289","ref":"core/src/mindustry/ai/ControlPathfinder.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ai/ControlPathfinder.java#L405","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: core/src/mindustry/ai/ControlPathfinder.java:1391 and core/src/mindustry/ai/ControlPathfinder.java:1456","ref":"core/src/mindustry/ai/ControlPathfinder.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ai/ControlPathfinder.java#L1391","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: core/src/mindustry/ai/UnitCommand.java:56 and core/src/mindustry/ai/UnitStance.java:65","ref":"core/src/mindustry/ai/UnitCommand.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ai/UnitCommand.java#L56","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: core/src/mindustry/ai/types/BuilderAI.java:46 and core/src/mindustry/ai/types/PrebuildAI.java:100","ref":"core/src/mindustry/ai/types/BuilderAI.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ai/types/BuilderAI.java#L46","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: core/src/mindustry/ai/types/BuilderAI.java:113 and core/src/mindustry/world/blocks/defense/BuildTurret.java:199","ref":"core/src/mindustry/ai/types/BuilderAI.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ai/types/BuilderAI.java#L113","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: core/src/mindustry/ai/types/CommandAI.java:219 and core/src/mindustry/input/InputHandler.java:579","ref":"core/src/mindustry/ai/types/CommandAI.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ai/types/CommandAI.java#L219","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: core/src/mindustry/ai/types/MinerAI.java:45 and core/src/mindustry/ai/types/PrebuildAI.java:197","ref":"core/src/mindustry/ai/types/MinerAI.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/ai/types/MinerAI.java#L45","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: core/src/mindustry/audio/SoundControl.java:444 and core/src/mindustry/audio/SoundControl.java:554","ref":"core/src/mindustry/audio/SoundControl.java","url":"https://github.com/Anuken/Mindustry/blob/1a22b880576d2f8f97550280f76bfdd0d0069543/core/src/mindustry/audio/SoundControl.java#L444","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":39.0,"weighted_findings":107.5,"scanned_lines":183227.0,"category:correctness":39.0},"findings":[{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/ai/types/BuilderAI.java","line":153,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/ai/types/BuilderAI.java:153"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`sign == sign` or `sign != sign` is always true. (Unless the value compared is a float or double). To test if `sign` is not-a-number, use `Double.isNaN(sign)`.","path":"core/src/mindustry/core/NetServer.java","line":501,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/core/NetServer.java:501"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`tmpUnit == tmpUnit` or `tmpUnit != tmpUnit` is always true. (Unless the value compared is a float or double). To test if `tmpUnit` is not-a-number, use `Double.isNaN(tmpUnit)`.","path":"core/src/mindustry/entities/Damage.java","line":408,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/Damage.java:408"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`deltax == deltax` or `deltax != deltax` is always true. (Unless the value compared is a float or double). To test if `deltax` is not-a-number, use `Double.isNaN(deltax)`.","path":"core/src/mindustry/entities/EntityCollisions.java","line":38,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/EntityCollisions.java:38"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`deltay == deltay` or `deltay != deltay` is always true. (Unless the value compared is a float or double). To test if `deltay` is not-a-number, use `Double.isNaN(deltay)`.","path":"core/src/mindustry/entities/EntityCollisions.java","line":38,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/EntityCollisions.java:38"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`buildResult == buildResult` or `buildResult != buildResult` is always true. (Unless the value compared is a float or double). To test if `buildResult` is not-a-number, use `Double.isNaN(buildResult)`.","path":"core/src/mindustry/entities/Units.java","line":238,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/Units.java:238"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`result == result` or `result != result` is always true. (Unless the value compared is a float or double). To test if `result` is not-a-number, use `Double.isNaN(result)`.","path":"core/src/mindustry/entities/Units.java","line":307,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/Units.java:307"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`result == result` or `result != result` is always true. (Unless the value compared is a float or double). To test if `result` is not-a-number, use `Double.isNaN(result)`.","path":"core/src/mindustry/entities/Units.java","line":329,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/Units.java:329"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`result == result` or `result != result` is always true. (Unless the value compared is a float or double). To test if `result` is not-a-number, use `Double.isNaN(result)`.","path":"core/src/mindustry/entities/Units.java","line":366,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/Units.java:366"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`result == result` or `result != result` is always true. (Unless the value compared is a float or double). To test if `result` is not-a-number, use `Double.isNaN(result)`.","path":"core/src/mindustry/entities/Units.java","line":384,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/Units.java:384"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`result == result` or `result != result` is always true. (Unless the value compared is a float or double). To test if `result` is not-a-number, use `Double.isNaN(result)`.","path":"core/src/mindustry/entities/Units.java","line":403,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/Units.java:403"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`result == result` or `result != result` is always true. (Unless the value compared is a float or double). To test if `result` is not-a-number, use `Double.isNaN(result)`.","path":"core/src/mindustry/entities/bullet/PointBulletType.java","line":51,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/entities/bullet/PointBulletType.java:51"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`result == result` or `result != result` is always true. (Unless the value compared is a float or double). To test if `result` is not-a-number, use `Double.isNaN(result)`.","path":"core/src/mindustry/game/Schematics.java","line":350,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/game/Schematics.java:350"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/graphics/BlockRenderer.java","line":709,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/graphics/BlockRenderer.java:709"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/graphics/BlockRenderer.java","line":763,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/graphics/BlockRenderer.java:763"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/graphics/BlockRenderer.java","line":770,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/graphics/BlockRenderer.java:770"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/graphics/BlockRenderer.java","line":861,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/graphics/BlockRenderer.java:861"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/graphics/FloorRenderer.java","line":375,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/graphics/FloorRenderer.java:375"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/graphics/LoadRenderer.java","line":83,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/graphics/LoadRenderer.java:83"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/graphics/LoadRenderer.java","line":132,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/graphics/LoadRenderer.java:132"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/logic/LCanvas.java","line":264,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/logic/LCanvas.java:264"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`result == result` or `result != result` is always true. (Unless the value compared is a float or double). To test if `result` is not-a-number, use `Double.isNaN(result)`.","path":"core/src/mindustry/maps/Maps.java","line":471,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/maps/Maps.java:471"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/maps/generators/BaseGenerator.java","line":90,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/maps/generators/BaseGenerator.java:90"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/maps/generators/BaseGenerator.java","line":216,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/maps/generators/BaseGenerator.java:216"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/mod/ContentParser.java","line":1278,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/mod/ContentParser.java:1278"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/net/ArcNetProvider.java","line":497,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/net/ArcNetProvider.java:497"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/net/ArcNetProvider.java","line":544,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/net/ArcNetProvider.java:544"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/net/ArcNetProvider.java","line":583,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/net/ArcNetProvider.java:583"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`f == f` or `f != f` is always true. (Unless the value compared is a float or double). To test if `f` is not-a-number, use `Double.isNaN(f)`.","path":"core/src/mindustry/ui/builder/UiDslWriter.java","line":87,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/ui/builder/UiDslWriter.java:87"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/ui/fragments/HudFragment.java","line":676,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/ui/fragments/HudFragment.java:676"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`following == following` or `following != following` is always true. (Unless the value compared is a float or double). To test if `following` is not-a-number, use `Double.isNaN(following)`.","path":"core/src/mindustry/world/blocks/defense/BuildTurret.java","line":177,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/world/blocks/defense/BuildTurret.java:177"},{"rule_id":"opengrep/java.lang.correctness.eqeq","severity":"high","message":"`otherPlan == otherPlan` or `otherPlan != otherPlan` is always true. (Unless the value compared is a float or double). To test if `otherPlan` is not-a-number, use `Double.isNaN(otherPlan)`.","path":"core/src/mindustry/world/blocks/distribution/DirectionBridge.java","line":79,"fingerprint":"java.lang.correctness.eqeq:core/src/mindustry/world/blocks/distribution/DirectionBridge.java:79"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/world/blocks/units/UnitFactory.java","line":59,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/world/blocks/units/UnitFactory.java:59"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"core/src/mindustry/world/blocks/units/UnitFactory.java","line":70,"fingerprint":"java.lang.correctness.hardcoded-conditional:core/src/mindustry/world/blocks/units/UnitFactory.java:70"},{"rule_id":"opengrep/java.lang.correctness.hardcoded-conditional","severity":"high","message":"This if statement will always have the same behavior and is therefore unnecessary.","path":"tools/src/mindustry/tools/Generators.java","line":535,"fingerprint":"java.lang.correctness.hardcoded-conditional:tools/src/mindustry/tools/Generators.java:535"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"core/src/mindustry/game/Team.java","line":180,"fingerprint":"java.lang.correctness.no-string-eqeq:core/src/mindustry/game/Team.java:180"},{"rule_id":"opengrep/java.lang.correctness.no-string-eqeq","severity":"medium","message":"Strings should not be compared with '=='. This is a reference comparison operator. Use '.equals()' instead.","path":"core/src/mindustry/logic/LStatements.java","line":1334,"fingerprint":"java.lang.correctness.no-string-eqeq:core/src/mindustry/logic/LStatements.java:1334"},{"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":"ios/convert_audio.sh","line":3,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:ios/convert_audio.sh:3"},{"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":"ios/convert_audio.sh","line":7,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:ios/convert_audio.sh:7"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.0309,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.1031,"test_lines":2835.0,"source_lines":183227.0,"test_ratio":0.0155,"ci_files":4.0,"cochange_share":0.0258,"cochange_commits":194.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/deployment.yml","ref":".github/workflows/deployment.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/gradle-wrapper-validation.yml","ref":".github/workflows/gradle-wrapper-validation.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/pr.yml","ref":".github/workflows/pr.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/push.yml","ref":".github/workflows/push.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (gradlew test)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["gradlew test"],"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":49.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":4.0,"other_lines":183223.0,"files_blamed":865.0,"blame_failures":0.0,"quality:ai_findings":0.0,"quality:ai_per_kloc":0.0,"quality:other_findings":39.0,"quality:other_per_kloc":0.213,"security:ai_findings":0.0,"security:ai_per_kloc":0.0,"security:other_findings":5.0,"security:other_per_kloc":0.027},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":[]}