{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:01.894748Z","repo":{"ref":{"host":"github.com","owner":"Terry-Mao","name":"gopush-cluster"},"default_branch":"master","clone_url":"https://github.com/Terry-Mao/gopush-cluster.git","html_url":"https://github.com/Terry-Mao/gopush-cluster","description":"Golang push server cluster","stars":2066,"forks":544,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":922,"primary_language":"Go","license_spdx":"GPL-3.0","created_at":"2013-12-27T08:56:10Z","pushed_at":"2017-06-07T12:18:31Z","security_policy_url":null,"distribution":{"owner_created_at":"2012-04-10T02:55:54Z","owner_type":"User","release_assets":[]}},"commit_sha":"1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5","profile":{"lines_by_language":{"Go":6820,"Shell":54,"SQL":51},"files_by_category":{"source":48,"other":15,"test":10,"config":5,"docs":5,"binary":2},"source_lines":6278,"test_lines":647},"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":53.0,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":77.0,"duplication":28.4,"lint":66.9,"testing":27.5,"docs":85.0,"type_safety":null,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.10, no CI test run detected; 9% of function code in complex or long functions; 21% duplicated lines. Weakest area: testing."},"security":{"score":66.5,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":100.0,"sast":57.8,"dependencies":null,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 3 high-severity SAST 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":485.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":18859.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2013-12":{"loc":3739,"attributed_loc":0},"2014-01":{"loc":5012,"attributed_loc":0},"2014-02":{"loc":518,"attributed_loc":0},"2014-03":{"loc":2473,"attributed_loc":0},"2014-04":{"loc":3420,"attributed_loc":0},"2014-05":{"loc":89,"attributed_loc":0},"2014-06":{"loc":440,"attributed_loc":0},"2014-08":{"loc":886,"attributed_loc":0},"2014-09":{"loc":2069,"attributed_loc":0},"2014-10":{"loc":95,"attributed_loc":0},"2014-12":{"loc":3,"attributed_loc":0},"2015-01":{"loc":1,"attributed_loc":0},"2015-09":{"loc":15,"attributed_loc":0},"2016-01":{"loc":3,"attributed_loc":0},"2016-06":{"loc":36,"attributed_loc":0},"2016-08":{"loc":3,"attributed_loc":0},"2016-12":{"loc":17,"attributed_loc":0},"2017-04":{"loc":40,"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":210.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":18859.0,"pre_ai_era_burst_loc":0.0,"measured_loc":18859.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":309.6774193548387,"median_loc_per_hour":59.75,"pr_timed_units":0.0,"excluded_import_loc":0.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":[]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":4.0,"flagged_releases":0.0,"max_loc_per_day":308.7},"findings":[],"evidence":[],"data":{"releases":[{"from":"v1.0.0","to":"v1.0.1","loc":5,"days":0.43,"loc_per_day":11.6,"flagged":false},{"from":"v1.0.1","to":"v1.0.2","loc":3,"days":0.3,"loc_per_day":10.2,"flagged":false},{"from":"v1.0.2","to":"v1.0.3","loc":266,"days":0.86,"loc_per_day":308.7,"flagged":false},{"from":"v1.0.3","to":"v1.0.4","loc":79,"days":28.29,"loc_per_day":2.8,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":6278.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":12.0,"findings_high":3.0,"findings_medium":9.0,"findings_low":0.0,"weighted_findings":9.75,"scanned_lines":6227.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/dockerfile.security.missing-user","severity":"high","message":"By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'. [confidence medium]","path":"comet/Dockerfile","line":25,"fingerprint":"dockerfile.security.missing-user:comet/Dockerfile:25"},{"rule_id":"opengrep/dockerfile.security.missing-user","severity":"high","message":"By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'. [confidence medium]","path":"message/Dockerfile","line":24,"fingerprint":"dockerfile.security.missing-user:message/Dockerfile:24"},{"rule_id":"opengrep/dockerfile.security.missing-user","severity":"high","message":"By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'. [confidence medium]","path":"web/Dockerfile","line":24,"fingerprint":"dockerfile.security.missing-user:web/Dockerfile:24"},{"rule_id":"opengrep/go.lang.security.audit.net.use-tls","severity":"medium","message":"Found an HTTP server without TLS. Use 'http.ListenAndServeTLS' instead. See https://golang.org/pkg/net/http/#ListenAndServeTLS for more information. [confidence medium]","path":"comet/pubsub_websocket.go","line":78,"fingerprint":"go.lang.security.audit.net.use-tls:comet/pubsub_websocket.go:78"},{"rule_id":"opengrep/go.lang.security.audit.net.use-tls","severity":"medium","message":"Found an HTTP server without TLS. Use 'http.ListenAndServeTLS' instead. See https://golang.org/pkg/net/http/#ListenAndServeTLS for more information. [confidence medium]","path":"comet/stat.go","line":119,"fingerprint":"go.lang.security.audit.net.use-tls:comet/stat.go:119"},{"rule_id":"opengrep/go.lang.security.audit.xss.no-direct-write-to-responsewriter","severity":"medium","message":"Detected directly writing or similar in 'http.ResponseWriter.write()'. This bypasses HTML escaping that prevents cross-site scripting vulnerabilities. Instead, use the 'html/template' package and render data using 'template.Execute()'. [confidence low]","path":"comet/stat.go","line":276,"fingerprint":"go.lang.security.audit.xss.no-direct-write-to-responsewriter:comet/stat.go:276"},{"rule_id":"opengrep/go.lang.security.audit.crypto.use-of-sha1","severity":"medium","message":"Detected SHA1 hash algorithm which is considered insecure. SHA1 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead. [confidence medium]","path":"ketama/ketama.go","line":67,"fingerprint":"go.lang.security.audit.crypto.use-of-sha1:ketama/ketama.go:67"},{"rule_id":"opengrep/go.lang.security.audit.crypto.use-of-sha1","severity":"medium","message":"Detected SHA1 hash algorithm which is considered insecure. SHA1 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead. [confidence medium]","path":"ketama/ketama.go","line":88,"fingerprint":"go.lang.security.audit.crypto.use-of-sha1:ketama/ketama.go:88"},{"rule_id":"opengrep/go.lang.security.audit.net.use-tls","severity":"medium","message":"Found an HTTP server without TLS. Use 'http.ListenAndServeTLS' instead. See https://golang.org/pkg/net/http/#ListenAndServeTLS for more information. [confidence medium]","path":"perf/perf.go","line":34,"fingerprint":"go.lang.security.audit.net.use-tls:perf/perf.go:34"},{"rule_id":"opengrep/go.lang.security.audit.crypto.math-random-used","severity":"medium","message":"Do not use `math/rand`. Use `crypto/rand` instead. [confidence medium]","path":"rpc/rand_lb.go","line":23,"fingerprint":"go.lang.security.audit.crypto.math-random-used:rpc/rand_lb.go:23"},{"rule_id":"opengrep/go.lang.security.audit.xss.no-direct-write-to-responsewriter","severity":"medium","message":"Detected directly writing or similar in 'http.ResponseWriter.write()'. This bypasses HTML escaping that prevents cross-site scripting vulnerabilities. Instead, use the 'html/template' package and render data using 'template.Execute()'. [confidence low]","path":"web/http.go","line":92,"fingerprint":"go.lang.security.audit.xss.no-direct-write-to-responsewriter:web/http.go:92"},{"rule_id":"opengrep/go.lang.security.audit.xss.no-direct-write-to-responsewriter","severity":"medium","message":"Detected directly writing or similar in 'http.ResponseWriter.write()'. This bypasses HTML escaping that prevents cross-site scripting vulnerabilities. Instead, use the 'html/template' package and render data using 'template.Execute()'. [confidence low]","path":"web/http.go","line":109,"fingerprint":"go.lang.security.audit.xss.no-direct-write-to-responsewriter:web/http.go:109"}],"evidence":[],"data":{"rulesets":["go","bash","dockerfile"]},"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":236.0,"function_nloc":3622.0,"mean_ccn":3.39,"p90_ccn":7.0,"complex_functions":3.0,"long_functions":1.0,"many_param_functions":0.0,"risky_nloc_share":0.0872},"findings":[],"evidence":[{"kind":"complex-function","description":"SubscribeTCPHandle in comet/pubsub_tcp.go: complexity 19, 92 lines","ref":"comet/pubsub_tcp.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/pubsub_tcp.go#L183","weight":0.31666666666666665},{"kind":"complex-function","description":"Murmur3F in hash/mmhash3.go: complexity 17, 91 lines","ref":"hash/mmhash3.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/hash/mmhash3.go#L334","weight":0.2833333333333333},{"kind":"complex-function","description":"Murmur3C in hash/mmhash3.go: complexity 17, 133 lines","ref":"hash/mmhash3.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/hash/mmhash3.go#L180","weight":0.2833333333333333}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":4714.0,"duplicated_lines":989.0,"duplicated_share":0.2098,"files":48.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: comet/channel.go:1 and comet/config.go:1","ref":"comet/channel.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/channel.go#L1","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: comet/channel.go:10 and comet/conn.go:10","ref":"comet/channel.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/channel.go#L10","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: comet/channel.go:11 and comet/pubsub.go:11","ref":"comet/channel.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/channel.go#L11","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: comet/config.go:10 and message/config.go:10","ref":"comet/config.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/config.go#L10","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: comet/config.go:11 and web/config.go:11","ref":"comet/config.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/config.go#L11","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: comet/main.go:11 and message/main.go:11","ref":"comet/main.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/main.go#L11","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: comet/main.go:57 and web/main.go:41","ref":"comet/main.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/main.go#L57","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: comet/pubsub_tcp.go:219 and comet/pubsub_websocket.go:112","ref":"comet/pubsub_tcp.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/pubsub_tcp.go#L219","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: comet/rpc.go:39 and message/rpc.go:36","ref":"comet/rpc.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/rpc.go#L39","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: comet/signal.go:11 and message/signal.go:11","ref":"comet/signal.go","url":"https://github.com/Terry-Mao/gopush-cluster/blob/1c279b4d085fe66fc0cfca66bf2ddfeb0a5d3bc5/comet/signal.go#L11","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":13.0,"weighted_findings":10.0,"scanned_lines":6227.0,"category:best-practice":1.0,"category:correctness":12.0},"findings":[{"rule_id":"opengrep/go.lang.best-practice.hidden-goroutine","severity":"medium","message":"Detected a hidden goroutine. Function invocations are expected to synchronous, and this function will execute asynchronously because all it does is call a goroutine. Instead, remove the internal goroutine and call the function using 'go'.","path":"comet/conn.go","line":34,"fingerprint":"go.lang.best-practice.hidden-goroutine:comet/conn.go:34"},{"rule_id":"opengrep/go.lang.correctness.permissions.incorrect-default-permission","severity":"medium","message":"Detected file permissions that are set to more than `0600` (user/owner can read and write). Setting file permissions to higher than `0600` is most likely unnecessary and violates the principle of least privilege. Instead, set permissions to be `0600` or less for os.Chmod, os.Mkdir, os.OpenFile, os.M","path":"process/process.go","line":42,"fingerprint":"go.lang.correctness.permissions.incorrect-default-permission:process/process.go:42"},{"rule_id":"opengrep/go.lang.correctness.use-filepath-join","severity":"medium","message":"`path.Join(...)` always joins using a forward slash. This may cause issues on Windows or other systems using a different delimiter. Use `filepath.Join(...)` instead which uses OS-specific path separators.","path":"rpc/comet.go","line":149,"fingerprint":"go.lang.correctness.use-filepath-join:rpc/comet.go:149"},{"rule_id":"opengrep/go.lang.correctness.use-filepath-join","severity":"medium","message":"`path.Join(...)` always joins using a forward slash. This may cause issues on Windows or other systems using a different delimiter. Use `filepath.Join(...)` instead which uses OS-specific path separators.","path":"rpc/comet.go","line":271,"fingerprint":"go.lang.correctness.use-filepath-join:rpc/comet.go:271"},{"rule_id":"opengrep/go.lang.correctness.use-filepath-join","severity":"medium","message":"`path.Join(...)` always joins using a forward slash. This may cause issues on Windows or other systems using a different delimiter. Use `filepath.Join(...)` instead which uses OS-specific path separators.","path":"rpc/comet.go","line":307,"fingerprint":"go.lang.correctness.use-filepath-join:rpc/comet.go:307"},{"rule_id":"opengrep/go.lang.correctness.use-filepath-join","severity":"medium","message":"`path.Join(...)` always joins using a forward slash. This may cause issues on Windows or other systems using a different delimiter. Use `filepath.Join(...)` instead which uses OS-specific path separators.","path":"rpc/message.go","line":160,"fingerprint":"go.lang.correctness.use-filepath-join:rpc/message.go:160"},{"rule_id":"opengrep/go.lang.correctness.use-filepath-join","severity":"medium","message":"`path.Join(...)` always joins using a forward slash. This may cause issues on Windows or other systems using a different delimiter. Use `filepath.Join(...)` instead which uses OS-specific path separators.","path":"rpc/message.go","line":162,"fingerprint":"go.lang.correctness.use-filepath-join:rpc/message.go:162"},{"rule_id":"opengrep/go.lang.correctness.use-filepath-join","severity":"medium","message":"`path.Join(...)` always joins using a forward slash. This may cause issues on Windows or other systems using a different delimiter. Use `filepath.Join(...)` instead which uses OS-specific path separators.","path":"zk/zk.go","line":61,"fingerprint":"go.lang.correctness.use-filepath-join:zk/zk.go:61"},{"rule_id":"opengrep/go.lang.correctness.use-filepath-join","severity":"medium","message":"`path.Join(...)` always joins using a forward slash. This may cause issues on Windows or other systems using a different delimiter. Use `filepath.Join(...)` instead which uses OS-specific path separators.","path":"zk/zk.go","line":79,"fingerprint":"go.lang.correctness.use-filepath-join:zk/zk.go:79"},{"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":"spawn-docker-images.sh","line":3,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:spawn-docker-images.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":"spawn-docker-images.sh","line":8,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:spawn-docker-images.sh:8"},{"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":"spawn-docker-images.sh","line":21,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:spawn-docker-images.sh:21"},{"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":"spawn-docker-images.sh","line":33,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:spawn-docker-images.sh:33"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.2061,"check:ci_present":0.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.2311,"test_lines":647.0,"source_lines":6278.0,"test_ratio":0.1031,"ci_files":0.0,"cochange_share":0.0578,"cochange_commits":225.0},"findings":[],"evidence":[],"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":24.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":"CHANGELOG.md","ref":"CHANGELOG.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}],"flags":[]}