{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:00.146944Z","repo":{"ref":{"host":"github.com","owner":"Blizzard","name":"s2client-api"},"default_branch":"master","clone_url":"https://github.com/Blizzard/s2client-api.git","html_url":"https://github.com/Blizzard/s2client-api","description":"StarCraft II Client - C++ library supported on Windows, Linux and Mac designed for building scripted bots and research using the SC2API.","stars":1685,"forks":280,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":11577,"primary_language":"C++","license_spdx":"MIT","created_at":"2017-07-10T22:27:41Z","pushed_at":"2019-12-16T12:05:23Z","security_policy_url":null,"distribution":{"owner_created_at":"2010-11-15T23:44:43Z","owner_type":"Organization","release_assets":[]}},"commit_sha":"614acc00abb5355e4c94a1b0279b46e9d845b7ce","profile":{"lines_by_language":{"C++":17219,"C":5629,"Shell":132},"files_by_category":{"source":73,"test":32,"docs":12,"other":8,"binary":5,"config":4,"oversized":1},"source_lines":17803,"test_lines":5177},"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.169},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":59.2,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":38.9,"duplication":82.9,"lint":99.3,"testing":52.7,"docs":65.0,"type_safety":null,"process":15.0},"summary":"Code quality is weak: test-to-source ratio 0.29, no CI test run detected; 31% of function code in complex or long functions; 3% duplicated lines. Weakest area: process."},"security":{"score":71.9,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":93.6,"sast":100.0,"dependencies":null,"ci_actions":null,"posture":0.0,"scorecard":33.3},"summary":"Security posture is adequate: no high-impact findings. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"ok","tool_version":"scorecard v5.6.0","metrics":{"aggregate":2.9,"check:Code-Review":3.0,"check:Maintained":0.0,"check:Binary-Artifacts":10.0,"check:CII-Best-Practices":0.0,"check:Security-Policy":0.0,"check:Fuzzing":0.0,"check:License":10.0,"check:SAST":0.0},"findings":[],"evidence":[{"kind":"scorecard-check","description":"Scorecard Code-Review: 3/10 (Found 8/22 approved changesets -- score normalized to 3)","ref":"Code-Review","url":"https://scorecard.dev/viewer/?uri=github.com/Blizzard/s2client-api","weight":0.7},{"kind":"scorecard-check","description":"Scorecard Maintained: 0/10 (0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0)","ref":"Maintained","url":"https://scorecard.dev/viewer/?uri=github.com/Blizzard/s2client-api","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/Blizzard/s2client-api","weight":0.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/Blizzard/s2client-api","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/Blizzard/s2client-api","weight":1.0},{"kind":"scorecard-check","description":"Scorecard Fuzzing: 0/10 (project is not fuzzed)","ref":"Fuzzing","url":"https://scorecard.dev/viewer/?uri=github.com/Blizzard/s2client-api","weight":1.0},{"kind":"scorecard-check","description":"Scorecard License: 10/10 (license file detected)","ref":"License","url":"https://scorecard.dev/viewer/?uri=github.com/Blizzard/s2client-api","weight":0.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/Blizzard/s2client-api","weight":1.0}],"data":{"date":"2026-11-09","commit":"614acc00abb5355e4c94a1b0279b46e9d845b7ce","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":135.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":26825.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2017-07":{"loc":23652,"attributed_loc":0},"2017-08":{"loc":650,"attributed_loc":0},"2017-09":{"loc":1090,"attributed_loc":0},"2017-10":{"loc":117,"attributed_loc":0},"2017-11":{"loc":1255,"attributed_loc":0},"2017-12":{"loc":23,"attributed_loc":0},"2018-01":{"loc":18,"attributed_loc":0},"2018-03":{"loc":2,"attributed_loc":0},"2018-04":{"loc":0,"attributed_loc":0},"2018-05":{"loc":7,"attributed_loc":0},"2018-06":{"loc":8,"attributed_loc":0},"2019-01":{"loc":0,"attributed_loc":0},"2019-02":{"loc":0,"attributed_loc":0},"2019-03":{"loc":3,"attributed_loc":0},"2019-04":{"loc":0,"attributed_loc":0},"2019-05":{"loc":0,"attributed_loc":0},"2019-06":{"loc":0,"attributed_loc":0},"2019-07":{"loc":0,"attributed_loc":0},"2019-08":{"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":62.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":3173.0,"pre_ai_era_burst_loc":0.0,"measured_loc":3173.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":222.0,"median_loc_per_hour":59.34698010032069,"pr_timed_units":0.0,"excluded_import_loc":23652.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["c93b084b888a27845ad599f467d7a82a01494448"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":0.0,"flagged_releases":0.0,"max_loc_per_day":0.0},"findings":[],"evidence":[],"data":{"releases":[]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":17803.0,"index":0.169,"count:narrated_steps":3.0,"per_kloc:narrated_steps":0.169,"files:narrated_steps":2.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":[{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: // First, find a random point inside the playable area of the map.","ref":"examples/common/bot_examples.cc:233","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/common/bot_examples.cc#L233","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: // Step 1: distinguish between a hang and a crash. Lots of time has elapsed, so if there was a crash","ref":"src/sc2api/sc2_client.cc:1823","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2api/sc2_client.cc#L1823","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: // Step 2: distinguish between a non-responsive app and a failure to deliver a valid request.","ref":"src/sc2api/sc2_client.cc:1833","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2api/sc2_client.cc#L1833","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":0.0,"secrets_nonprod":1.0,"secrets_low_confidence":1.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit 907f8bd4bf); removed from the current tree but still retrievable","path":"dir_3d0dfd3160b31ffa512c49330ac8d646.html","line":7,"fingerprint":"907f8bd4bf39099773ec5a11ac7be256b00a6289:dir_3d0dfd3160b31ffa512c49330ac8d646.html:generic-api-key:7"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit c93b084b88); removed from the current tree but still retrievable","path":"docs/html/dir_3d0dfd3160b31ffa512c49330ac8d646.html","line":8,"fingerprint":"c93b084b888a27845ad599f467d7a82a01494448:docs/html/dir_3d0dfd3160b31ffa512c49330ac8d646.html:generic-api-key:8"}],"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":17803.0,"parse_errors":4.0},"findings":[],"evidence":[],"data":{"rulesets":["c","bash"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":0.0,"check:lockfiles":1.0,"signed_commit_share":0.0667,"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":704.0,"function_nloc":9934.0,"mean_ccn":4.78,"p90_ccn":8.0,"complex_functions":26.0,"long_functions":11.0,"many_param_functions":1.0,"risky_nloc_share":0.3147},"findings":[],"evidence":[{"kind":"complex-function","description":"sc2::AbilityTypeToName in src/sc2api/sc2_typeenums.cc: complexity 468, 472 lines","ref":"src/sc2api/sc2_typeenums.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2api/sc2_typeenums.cc#L213","weight":1.0},{"kind":"complex-function","description":"sc2::UnitTypeToName in src/sc2api/sc2_typeenums.cc: complexity 202, 206 lines","ref":"src/sc2api/sc2_typeenums.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2api/sc2_typeenums.cc#L5","weight":1.0},{"kind":"complex-function","description":"sc2::UpgradeIDToName in src/sc2api/sc2_typeenums.cc: complexity 89, 93 lines","ref":"src/sc2api/sc2_typeenums.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2api/sc2_typeenums.cc#L687","weight":1.0},{"kind":"complex-function","description":"sc2::TerranMultiplayerBot::BuildArmy in examples/common/bot_examples.cc: complexity 83, 187 lines","ref":"examples/common/bot_examples.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/common/bot_examples.cc#L2156","weight":1.0},{"kind":"complex-function","description":"sc2::TerranMultiplayerBot::ManageArmy in examples/common/bot_examples.cc: complexity 78, 253 lines","ref":"examples/common/bot_examples.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/common/bot_examples.cc#L2627","weight":1.0},{"kind":"complex-function","description":"sc2::ZergMultiplayerBot::ManageArmy in examples/common/bot_examples.cc: complexity 57, 229 lines","ref":"examples/common/bot_examples.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/common/bot_examples.cc#L1476","weight":0.95},{"kind":"complex-function","description":"sc2::ZergMultiplayerBot::BuildArmy in examples/common/bot_examples.cc: complexity 54, 126 lines","ref":"examples/common/bot_examples.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/common/bot_examples.cc#L1710","weight":0.9},{"kind":"complex-function","description":"sc2::TerranMultiplayerBot::BuildOrder in examples/common/bot_examples.cc: complexity 53, 131 lines","ref":"examples/common/bot_examples.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/common/bot_examples.cc#L2355","weight":0.8833333333333333},{"kind":"complex-function","description":"sc2::ProtossMultiplayerBot::TryBuildArmy in examples/common/bot_examples.cc: complexity 52, 121 lines","ref":"examples/common/bot_examples.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/common/bot_examples.cc#L781","weight":0.8666666666666667},{"kind":"complex-function","description":"sc2::BuffIDToName in src/sc2api/sc2_typeenums.cc: complexity 45, 49 lines","ref":"src/sc2api/sc2_typeenums.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2api/sc2_typeenums.cc#L782","weight":0.75}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":12134.0,"duplicated_lines":378.0,"duplicated_share":0.0312,"files":73.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: examples/annoying_helper.cc:45 and examples/bot_micro.cc:8","ref":"examples/annoying_helper.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/annoying_helper.cc#L45","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: examples/annoying_helper.cc:57 and examples/echo_actions.cc:213","ref":"examples/annoying_helper.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/annoying_helper.cc#L57","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: examples/bot_mp.cc:53 and examples/intermediate_bot.cc:35","ref":"examples/bot_mp.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/bot_mp.cc#L53","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: examples/common/bot_examples.cc:322 and examples/common/bot_examples.cc:364","ref":"examples/common/bot_examples.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/common/bot_examples.cc#L322","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: examples/feature_layers.cc:51 and examples/rendered.cc:30","ref":"examples/feature_layers.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/examples/feature_layers.cc#L51","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/sc2api/sc2_client.cc:1680 and src/sc2api/sc2_replay_observer.cc:140","ref":"src/sc2api/sc2_client.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2api/sc2_client.cc#L1680","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/sc2api/sc2_coordinator.cc:379 and src/sc2api/sc2_coordinator.cc:442","ref":"src/sc2api/sc2_coordinator.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2api/sc2_coordinator.cc#L379","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/sc2renderer/sc2_renderer.cc:52 and src/sc2renderer/sc2_renderer.cc:77","ref":"src/sc2renderer/sc2_renderer.cc","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2renderer/sc2_renderer.cc#L52","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/sc2utils/dirent.h:216 and src/sc2utils/dirent.h:268","ref":"src/sc2utils/dirent.h","url":"https://github.com/Blizzard/s2client-api/blob/614acc00abb5355e4c94a1b0279b46e9d845b7ce/src/sc2utils/dirent.h#L216","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":2.0,"weighted_findings":0.5,"scanned_lines":17803.0,"category:correctness":2.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":"generate_and_deploy_doxygen.sh","line":47,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:generate_and_deploy_doxygen.sh:47"},{"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":"generate_and_deploy_doxygen.sh","line":54,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:generate_and_deploy_doxygen.sh:54"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.5816,"check:ci_present":1.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.3117,"test_lines":5177.0,"source_lines":17803.0,"test_ratio":0.2908,"ci_files":1.0,"cochange_share":0.0779,"cochange_commits":77.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":0.0,"readme_lines":69.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}