{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:07.208501Z","repo":{"ref":{"host":"github.com","owner":"ricardojmendez","name":"UnitySteer"},"default_branch":"development","clone_url":"https://github.com/ricardojmendez/UnitySteer.git","html_url":"https://github.com/ricardojmendez/UnitySteer","description":"Steering, obstacle avoidance and path following behaviors for the Unity Game Engine","stars":1255,"forks":270,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":1213,"primary_language":"C#","license_spdx":"NOASSERTION","created_at":"2009-07-06T14:31:43Z","pushed_at":"2019-10-01T17:16:19Z","security_policy_url":null,"distribution":{"owner_created_at":"2008-10-27T15:45:50Z","owner_type":"User","release_assets":[]}},"commit_sha":"1a2404d50b911e4adab5c43ae92ec3e34de0ef2c","profile":{"lines_by_language":{"C#":10015,"Shell":491,"Python":400},"files_by_category":{"other":94,"source":92,"docs":10,"config":3,"binary":1},"source_lines":10906,"test_lines":0},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.65,"coverage":1.0,"label":"none-detected","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":0.0,"style_index":0.0},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":48.9,"confidence":0.9,"coverage":1.0,"label":"poor","breakdown":{"complexity":83.2,"duplication":2.1,"lint":85.2,"testing":15.0,"docs":85.0,"type_safety":40.0,"process":null},"summary":"Code quality is poor: test-to-source ratio 0.00, no CI test run detected; 6% of function code in complex or long functions; 65% duplicated lines. Weakest area: duplication."},"security":{"score":81.8,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":100.0,"sast":100.0,"dependencies":null,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is adequate: no high-impact findings. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no registry dependencies declared"},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":546.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":28515.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2009-04":{"loc":4389,"attributed_loc":0},"2009-05":{"loc":2131,"attributed_loc":0},"2009-06":{"loc":748,"attributed_loc":0},"2009-07":{"loc":2575,"attributed_loc":0},"2009-08":{"loc":126,"attributed_loc":0},"2009-11":{"loc":1,"attributed_loc":0},"2010-02":{"loc":71,"attributed_loc":0},"2010-06":{"loc":1738,"attributed_loc":0},"2010-07":{"loc":1235,"attributed_loc":0},"2010-08":{"loc":278,"attributed_loc":0},"2010-09":{"loc":89,"attributed_loc":0},"2010-10":{"loc":581,"attributed_loc":0},"2010-11":{"loc":53,"attributed_loc":0},"2010-12":{"loc":180,"attributed_loc":0},"2011-01":{"loc":483,"attributed_loc":0},"2011-02":{"loc":362,"attributed_loc":0},"2011-03":{"loc":395,"attributed_loc":0},"2011-04":{"loc":107,"attributed_loc":0},"2011-05":{"loc":80,"attributed_loc":0},"2011-07":{"loc":146,"attributed_loc":0},"2011-08":{"loc":118,"attributed_loc":0},"2011-10":{"loc":44,"attributed_loc":0},"2011-11":{"loc":42,"attributed_loc":0},"2011-12":{"loc":23,"attributed_loc":0},"2012-03":{"loc":591,"attributed_loc":0},"2012-04":{"loc":453,"attributed_loc":0},"2012-05":{"loc":428,"attributed_loc":0},"2012-06":{"loc":695,"attributed_loc":0},"2012-12":{"loc":4,"attributed_loc":0},"2013-03":{"loc":0,"attributed_loc":0},"2013-06":{"loc":11,"attributed_loc":0},"2013-07":{"loc":33,"attributed_loc":0},"2013-08":{"loc":532,"attributed_loc":0},"2013-09":{"loc":30,"attributed_loc":0},"2013-10":{"loc":0,"attributed_loc":0},"2013-12":{"loc":223,"attributed_loc":0},"2014-01":{"loc":168,"attributed_loc":0},"2014-02":{"loc":279,"attributed_loc":0},"2014-04":{"loc":1,"attributed_loc":0},"2014-06":{"loc":2,"attributed_loc":0},"2014-07":{"loc":1601,"attributed_loc":0},"2014-08":{"loc":356,"attributed_loc":0},"2014-09":{"loc":3731,"attributed_loc":0},"2014-10":{"loc":5,"attributed_loc":0},"2014-11":{"loc":1,"attributed_loc":0},"2015-03":{"loc":4,"attributed_loc":0},"2015-10":{"loc":831,"attributed_loc":0},"2015-11":{"loc":1274,"attributed_loc":0},"2016-01":{"loc":744,"attributed_loc":0},"2016-02":{"loc":523,"attributed_loc":0},"2016-12":{"loc":0,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":326.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":24793.0,"pre_ai_era_burst_loc":0.0,"measured_loc":24793.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":433.26522272170007,"median_loc_per_hour":57.60081381198661,"pr_timed_units":0.0,"excluded_import_loc":3722.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["173fec99d5a5dd63eb092163cbcb9b50b18841d9"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":10.0,"flagged_releases":0.0,"max_loc_per_day":538.0},"findings":[],"evidence":[],"data":{"releases":[{"from":"v2.0.0","to":"v2.1","loc":1248,"days":126.49,"loc_per_day":9.9,"flagged":false},{"from":"v2.1","to":"v2.2","loc":325,"days":70.12,"loc_per_day":4.6,"flagged":false},{"from":"v2.2","to":"v2.5b1","loc":1851,"days":339.0,"loc_per_day":5.5,"flagged":false},{"from":"v2.5b1","to":"released-HairyTales-1.1","loc":532,"days":47.97,"loc_per_day":11.1,"flagged":false},{"from":"released-HairyTales-1.1","to":"v2.5b3","loc":600,"days":36.42,"loc_per_day":16.5,"flagged":false},{"from":"v2.5b3","to":"v2.5b4","loc":137,"days":263.05,"loc_per_day":0.5,"flagged":false},{"from":"v2.5b4","to":"v2.5","loc":11,"days":103.09,"loc_per_day":0.1,"flagged":false},{"from":"v2.5","to":"v2.5.1","loc":94,"days":32.44,"loc_per_day":2.9,"flagged":false},{"from":"v2.5.1","to":"v2.6","loc":65,"days":0.12,"loc_per_day":538.0,"flagged":false},{"from":"v2.6","to":"v2.7","loc":474,"days":86.21,"loc_per_day":5.5,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":10906.0,"index":0.0,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":0.0,"findings_high":0.0,"findings_medium":0.0,"findings_low":0.0,"weighted_findings":0.0,"scanned_lines":10906.0,"parse_errors":0.0},"findings":[],"evidence":[],"data":{"rulesets":["csharp","bash","python"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":0.0,"check:lockfiles":1.0,"signed_commit_share":0.0,"unpinned_manifests":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":288.0,"function_nloc":3196.0,"mean_ccn":2.33,"p90_ccn":5.0,"complex_functions":3.0,"long_functions":0.0,"many_param_functions":0.0,"risky_nloc_share":0.0613},"findings":[],"evidence":[{"kind":"complex-function","description":"SteerForPursuit2D::CalculateForce in 2D/Behaviors/SteerForPursuit2D.cs: complexity 17, 73 lines","ref":"2D/Behaviors/SteerForPursuit2D.cs","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/2D/Behaviors/SteerForPursuit2D.cs#L74","weight":0.2833333333333333},{"kind":"complex-function","description":"SteerForPursuit::CalculateForce in 3D/Behaviors/SteerForPursuit.cs: complexity 17, 73 lines","ref":"3D/Behaviors/SteerForPursuit.cs","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/3D/Behaviors/SteerForPursuit.cs#L71","weight":0.2833333333333333},{"kind":"complex-function","description":"parse_gh in .deploy/travis/gh_parser.py: complexity 16, 50 lines","ref":".deploy/travis/gh_parser.py","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/.deploy/travis/gh_parser.py#L5","weight":0.26666666666666666}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":7269.0,"duplicated_lines":4690.0,"duplicated_share":0.6452,"files":92.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: .deploy/travis/deploy_setup.py:54 and .deploy/travis/docs_parser.py:44","ref":".deploy/travis/deploy_setup.py","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/.deploy/travis/deploy_setup.py#L54","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: .deploy/travis/pre_deploy.sh:1 and .deploy/travis/unity_build.sh:1","ref":".deploy/travis/pre_deploy.sh","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/.deploy/travis/pre_deploy.sh#L1","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: .deploy/travis/pre_deploy.sh:157 and .deploy/travis/pre_deploy.sh:187","ref":".deploy/travis/pre_deploy.sh","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/.deploy/travis/pre_deploy.sh#L157","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: .deploy/travis/unity_build.sh:18 and .deploy/travis/unity_build.sh:72","ref":".deploy/travis/unity_build.sh","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/.deploy/travis/unity_build.sh#L18","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: 2D/Behaviors/AutonomousVehicle2D.cs:6 and 3D/Behaviors/AutonomousVehicle.cs:6","ref":"2D/Behaviors/AutonomousVehicle2D.cs","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/2D/Behaviors/AutonomousVehicle2D.cs#L6","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: 2D/Behaviors/AutonomousVehicle2D.cs:69 and 2D/Behaviors/Biped2D.cs:72","ref":"2D/Behaviors/AutonomousVehicle2D.cs","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/2D/Behaviors/AutonomousVehicle2D.cs#L69","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: 2D/Behaviors/Biped2D.cs:13 and 3D/Behaviors/Biped.cs:13","ref":"2D/Behaviors/Biped2D.cs","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/2D/Behaviors/Biped2D.cs#L13","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: 2D/Behaviors/Biped2D.cs:25 and 2D/Behaviors/PassiveVehicle2D.cs:41","ref":"2D/Behaviors/Biped2D.cs","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/2D/Behaviors/Biped2D.cs#L25","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: 2D/Behaviors/DetectableObject2D.cs:22 and 3D/Behaviors/DetectableObject.cs:21","ref":"2D/Behaviors/DetectableObject2D.cs","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/2D/Behaviors/DetectableObject2D.cs#L22","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: 2D/Behaviors/PassiveVehicle2D.cs:8 and 3D/Behaviors/PassiveVehicle.cs:7","ref":"2D/Behaviors/PassiveVehicle2D.cs","url":"https://github.com/ricardojmendez/UnitySteer/blob/1a2404d50b911e4adab5c43ae92ec3e34de0ef2c/2D/Behaviors/PassiveVehicle2D.cs#L8","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":7.0,"weighted_findings":7.0,"scanned_lines":10906.0,"category:best-practice":3.0,"category:correctness":4.0},"findings":[{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":".deploy/travis/deploy_setup.py","line":43,"fingerprint":"python.requests.best-practice.use-raise-for-status:.deploy/travis/deploy_setup.py:43"},{"rule_id":"opengrep/python.requests.best-practice.use-timeout","severity":"medium","message":"Detected a 'requests' call without a timeout set. By default, 'requests' calls wait until the connection is closed. This means a 'requests' call without a timeout will hang the program if a response is never received. Consider setting a timeout for all 'requests'.","path":".deploy/travis/deploy_setup.py","line":43,"fingerprint":"python.requests.best-practice.use-timeout:.deploy/travis/deploy_setup.py:43"},{"rule_id":"opengrep/python.lang.correctness.use-sys-exit","severity":"medium","message":"Detected use of `exit`. Use `sys.exit` over the python shell `exit` built-in. `exit` is a helper for the interactive shell and may not be available on all Python implementations.","path":".deploy/travis/deploy_setup.py","line":52,"fingerprint":"python.lang.correctness.use-sys-exit:.deploy/travis/deploy_setup.py:52"},{"rule_id":"opengrep/python.requests.best-practice.use-timeout","severity":"medium","message":"Detected a 'requests' call without a timeout set. By default, 'requests' calls wait until the connection is closed. This means a 'requests' call without a timeout will hang the program if a response is never received. Consider setting a timeout for all 'requests'.","path":".deploy/travis/docs_parser.py","line":42,"fingerprint":"python.requests.best-practice.use-timeout:.deploy/travis/docs_parser.py:42"},{"rule_id":"opengrep/python.lang.correctness.use-sys-exit","severity":"medium","message":"Detected use of `exit`. Use `sys.exit` over the python shell `exit` built-in. `exit` is a helper for the interactive shell and may not be available on all Python implementations.","path":".deploy/travis/main_parser.py","line":80,"fingerprint":"python.lang.correctness.use-sys-exit:.deploy/travis/main_parser.py:80"},{"rule_id":"opengrep/python.lang.correctness.use-sys-exit","severity":"medium","message":"Detected use of `exit`. Use `sys.exit` over the python shell `exit` built-in. `exit` is a helper for the interactive shell and may not be available on all Python implementations.","path":".deploy/travis/main_parser.py","line":82,"fingerprint":"python.lang.correctness.use-sys-exit:.deploy/travis/main_parser.py:82"},{"rule_id":"opengrep/python.lang.correctness.use-sys-exit","severity":"medium","message":"Detected use of `exit`. Use `sys.exit` over the python shell `exit` built-in. `exit` is a helper for the interactive shell and may not be available on all Python implementations.","path":".deploy/travis/misc_parser.py","line":18,"fingerprint":"python.lang.correctness.use-sys-exit:.deploy/travis/misc_parser.py:18"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":0.0,"check:test_ratio":0.0,"check:ci_present":1.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.0,"test_lines":0.0,"source_lines":10906.0,"test_ratio":0.0,"ci_files":1.0,"cochange_share":0.0,"cochange_commits":256.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .travis.yml","ref":".travis.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":0.0,"check:changelog":1.0,"readme_lines":19.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"License.txt","ref":"License.txt","url":null,"weight":0.0},{"kind":"docs","description":"CHANGELOG.md","ref":"CHANGELOG.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":0.0,"check:low_escape_density":1.0,"escapes":0.0,"escapes_per_kloc":0.0},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}