{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-13T23:30:29.808981Z","repo":{"ref":{"host":"github.com","owner":"plietar","name":"librespot"},"default_branch":"master","clone_url":"https://github.com/plietar/librespot.git","html_url":"https://github.com/plietar/librespot","description":"Open Source Spotify client library","stars":1155,"forks":186,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":1072,"primary_language":"Rust","license_spdx":"MIT","created_at":"2015-03-11T04:21:05Z","pushed_at":"2019-08-23T23:29:46Z","security_policy_url":null,"distribution":{"owner_created_at":"2012-03-01T19:56:54Z","owner_type":"User","release_assets":[]}},"commit_sha":"8971d3aa6864469a79c2640bb2afaf41c3d3728d","profile":{"lines_by_language":{"Rust":5386,"Shell":37},"files_by_category":{"source":52,"other":26,"config":9,"generated":7,"docs":4},"source_lines":5423,"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":null},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":64.1,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":77.7,"duplication":93.6,"lint":97.7,"testing":15.0,"docs":65.0,"type_safety":null,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.00, no CI test run detected; 8% of function code in complex or long functions; 1% duplicated lines. Weakest area: testing."},"security":{"score":55.1,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":84.6,"sast":80.8,"dependencies":19.9,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 0 possible secret(s) in the tree, 1 only in history; 27 known vulnerabilities in 20 dependencies; 1 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":"ok","tool_version":null,"metrics":{"declared":31.0,"checked":31.0,"missing":0.0,"recent":0.0,"lookup_errors":0.0},"findings":[],"evidence":[],"data":{"phantom":false},"error":null},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":310.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":52869.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2015-04":{"loc":306,"attributed_loc":0},"2015-05":{"loc":286,"attributed_loc":0},"2015-06":{"loc":1816,"attributed_loc":0},"2015-07":{"loc":1817,"attributed_loc":0},"2015-08":{"loc":14,"attributed_loc":0},"2015-09":{"loc":156,"attributed_loc":0},"2015-10":{"loc":37,"attributed_loc":0},"2015-12":{"loc":239,"attributed_loc":0},"2016-01":{"loc":2095,"attributed_loc":0},"2016-02":{"loc":672,"attributed_loc":0},"2016-03":{"loc":1729,"attributed_loc":0},"2016-04":{"loc":182,"attributed_loc":0},"2016-05":{"loc":564,"attributed_loc":0},"2016-07":{"loc":153,"attributed_loc":0},"2016-08":{"loc":35,"attributed_loc":0},"2016-09":{"loc":61,"attributed_loc":0},"2016-10":{"loc":120,"attributed_loc":0},"2016-11":{"loc":26935,"attributed_loc":0},"2016-12":{"loc":134,"attributed_loc":0},"2017-01":{"loc":8759,"attributed_loc":0},"2017-02":{"loc":913,"attributed_loc":0},"2017-03":{"loc":1,"attributed_loc":0},"2017-04":{"loc":973,"attributed_loc":0},"2017-05":{"loc":126,"attributed_loc":0},"2017-06":{"loc":44,"attributed_loc":0},"2017-07":{"loc":510,"attributed_loc":0},"2017-08":{"loc":526,"attributed_loc":0},"2017-09":{"loc":3653,"attributed_loc":0},"2017-10":{"loc":13,"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":166.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":15875.0,"pre_ai_era_burst_loc":0.0,"measured_loc":15875.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":410.35120147874306,"median_loc_per_hour":72.75,"pr_timed_units":7.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":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":5423.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":1.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[{"rule_id":"gitleaks/private-key","severity":"medium","message":"Possible private-key secret in history (commit 4b4bc2f4e1); removed from the current tree but still retrievable","path":"src/data/spotilocal.key","line":1,"fingerprint":"4b4bc2f4e1c2368e359ef25a76f41fdfe3446c8c:src/data/spotilocal.key:private-key:1"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":7.0,"findings_high":1.0,"findings_medium":0.0,"findings_low":6.0,"weighted_findings":3.3,"scanned_lines":5423.0,"parse_errors":5.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":"contrib/Dockerfile","line":46,"fingerprint":"dockerfile.security.missing-user:contrib/Dockerfile:46"},{"rule_id":"opengrep/rust.lang.security.unsafe-usage","severity":"low","message":"Detected 'unsafe' usage, please audit for secure usage [confidence high]","path":"core/src/component.rs","line":55,"fingerprint":"rust.lang.security.unsafe-usage:core/src/component.rs:55"},{"rule_id":"opengrep/rust.lang.security.unsafe-usage","severity":"low","message":"Detected 'unsafe' usage, please audit for secure usage [confidence high]","path":"core/src/component.rs","line":61,"fingerprint":"rust.lang.security.unsafe-usage:core/src/component.rs:61"},{"rule_id":"opengrep/rust.lang.security.unsafe-usage","severity":"low","message":"Detected 'unsafe' usage, please audit for secure usage [confidence high]","path":"src/audio_backend/pipe.rs","line":30,"fingerprint":"rust.lang.security.unsafe-usage:src/audio_backend/pipe.rs:30"},{"rule_id":"opengrep/rust.lang.security.unsafe-usage","severity":"low","message":"Detected 'unsafe' usage, please audit for secure usage [confidence high]","path":"src/audio_backend/pulseaudio.rs","line":27,"fingerprint":"rust.lang.security.unsafe-usage:src/audio_backend/pulseaudio.rs:27"},{"rule_id":"opengrep/rust.lang.security.unsafe-usage","severity":"low","message":"Detected 'unsafe' usage, please audit for secure usage [confidence high]","path":"src/audio_backend/pulseaudio.rs","line":55,"fingerprint":"rust.lang.security.unsafe-usage:src/audio_backend/pulseaudio.rs:55"},{"rule_id":"opengrep/rust.lang.security.args","severity":"low","message":"args should not be used for security operations. From the docs: \"The first element is traditionally the path of the executable, but it can be set to arbitrary text, and might not even exist. This means this property should not be relied upon for security purposes.\" [confidence high]","path":"src/main.rs","line":341,"fingerprint":"rust.lang.security.args:src/main.rs:341"}],"evidence":[],"data":{"rulesets":["rust","bash","dockerfile"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":20.0,"vulnerabilities":27.0,"vulns_critical":3.0,"vulns_high":3.0,"vulns_medium":6.0,"vulns_low":1.0,"vulns_unknown":14.0,"penalty":97.0},"findings":[{"rule_id":"osv/GHSA-h3qr-rq2j-74w4","severity":"critical","message":"hyper@0.11.2 (crates.io) is affected by RUSTSEC-2020-0008, GHSA-h3qr-rq2j-74w4","path":"Cargo.lock","line":null,"fingerprint":"hyper@0.11.2 (crates.io):GHSA-h3qr-rq2j-74w4"},{"rule_id":"osv/GHSA-5h46-h7hh-c6x9","severity":"critical","message":"hyper@0.11.2 (crates.io) is affected by RUSTSEC-2021-0079, GHSA-5h46-h7hh-c6x9","path":"Cargo.lock","line":null,"fingerprint":"hyper@0.11.2 (crates.io):GHSA-5h46-h7hh-c6x9"},{"rule_id":"osv/GHSA-qpjr-ch72-2qq4","severity":"critical","message":"portaudio-rs@0.3.0 (crates.io) is affected by RUSTSEC-2019-0022, GHSA-qpjr-ch72-2qq4","path":"Cargo.lock","line":null,"fingerprint":"portaudio-rs@0.3.0 (crates.io):GHSA-qpjr-ch72-2qq4"},{"rule_id":"osv/GHSA-mh6h-f25p-98f8","severity":"high","message":"protobuf@1.4.1 (crates.io) is affected by RUSTSEC-2019-0003, GHSA-mh6h-f25p-98f8","path":"Cargo.lock","line":null,"fingerprint":"protobuf@1.4.1 (crates.io):GHSA-mh6h-f25p-98f8"},{"rule_id":"osv/GHSA-m5pq-gvj9-9vr8","severity":"high","message":"regex@0.2.2 (crates.io) is affected by RUSTSEC-2022-0013, GHSA-m5pq-gvj9-9vr8","path":"Cargo.lock","line":null,"fingerprint":"regex@0.2.2 (crates.io):GHSA-m5pq-gvj9-9vr8"},{"rule_id":"osv/GHSA-55m5-whcv-c49c","severity":"high","message":"smallvec@0.2.1 (crates.io) is affected by RUSTSEC-2018-0018, GHSA-55m5-whcv-c49c, GHSA-66p5-j55p-32r9","path":"Cargo.lock","line":null,"fingerprint":"smallvec@0.2.1 (crates.io):GHSA-55m5-whcv-c49c"},{"rule_id":"osv/RUSTSEC-2025-0058","severity":"medium","message":"custom_derive@0.1.7 (crates.io) is affected by RUSTSEC-2025-0058","path":"Cargo.lock","line":null,"fingerprint":"custom_derive@0.1.7 (crates.io):RUSTSEC-2025-0058"},{"rule_id":"osv/RUSTSEC-2025-0121","severity":"medium","message":"gcc@0.3.51 (crates.io) is affected by RUSTSEC-2025-0121","path":"Cargo.lock","line":null,"fingerprint":"gcc@0.3.51 (crates.io):RUSTSEC-2025-0121"},{"rule_id":"osv/GHSA-f3pg-qwvg-p99c","severity":"medium","message":"hyper@0.11.2 (crates.io) is affected by RUSTSEC-2021-0078, GHSA-f3pg-qwvg-p99c","path":"Cargo.lock","line":null,"fingerprint":"hyper@0.11.2 (crates.io):GHSA-f3pg-qwvg-p99c"},{"rule_id":"osv/GHSA-f67m-9j94-qv9j","severity":"medium","message":"hyper@0.11.2 (crates.io) is affected by RUSTSEC-2022-0022, GHSA-f67m-9j94-qv9j","path":"Cargo.lock","line":null,"fingerprint":"hyper@0.11.2 (crates.io):GHSA-f67m-9j94-qv9j"},{"rule_id":"osv/GHSA-h97m-ww89-6jmq","severity":"medium","message":"idna@0.1.4 (crates.io) is affected by RUSTSEC-2024-0421, GHSA-h97m-ww89-6jmq","path":"Cargo.lock","line":null,"fingerprint":"idna@0.1.4 (crates.io):GHSA-h97m-ww89-6jmq"},{"rule_id":"osv/RUSTSEC-2020-0080","severity":"medium","message":"miow@0.2.1 (crates.io) is affected by RUSTSEC-2020-0080","path":"Cargo.lock","line":null,"fingerprint":"miow@0.2.1 (crates.io):RUSTSEC-2020-0080"},{"rule_id":"osv/RUSTSEC-2020-0016","severity":"medium","message":"net2@0.2.30 (crates.io) is affected by RUSTSEC-2020-0016","path":"Cargo.lock","line":null,"fingerprint":"net2@0.2.30 (crates.io):RUSTSEC-2020-0016"},{"rule_id":"osv/GHSA-458v-4hrf-g3m4","severity":"medium","message":"net2@0.2.30 (crates.io) is affected by RUSTSEC-2020-0078, GHSA-458v-4hrf-g3m4, GHSA-c79c-gwph-gqfm","path":"Cargo.lock","line":null,"fingerprint":"net2@0.2.30 (crates.io):GHSA-458v-4hrf-g3m4"},{"rule_id":"osv/GHSA-2gh3-rmm4-6rq5","severity":"medium","message":"protobuf@1.4.1 (crates.io) is affected by RUSTSEC-2024-0437, GHSA-2gh3-rmm4-6rq5","path":"Cargo.lock","line":null,"fingerprint":"protobuf@1.4.1 (crates.io):GHSA-2gh3-rmm4-6rq5"},{"rule_id":"osv/RUSTSEC-2016-0005","severity":"medium","message":"rust-crypto@0.2.36 (crates.io) is affected by RUSTSEC-2016-0005","path":"Cargo.lock","line":null,"fingerprint":"rust-crypto@0.2.36 (crates.io):RUSTSEC-2016-0005"},{"rule_id":"osv/GHSA-jp3w-3q88-34cf","severity":"medium","message":"rust-crypto@0.2.36 (crates.io) is affected by RUSTSEC-2022-0011, GHSA-jp3w-3q88-34cf","path":"Cargo.lock","line":null,"fingerprint":"rust-crypto@0.2.36 (crates.io):GHSA-jp3w-3q88-34cf"},{"rule_id":"osv/GHSA-2226-4v3c-cff8","severity":"medium","message":"rustc-serialize@0.3.24 (crates.io) is affected by RUSTSEC-2022-0004, GHSA-2226-4v3c-cff8","path":"Cargo.lock","line":null,"fingerprint":"rustc-serialize@0.3.24 (crates.io):GHSA-2226-4v3c-cff8"},{"rule_id":"osv/RUSTSEC-2025-0025","severity":"medium","message":"rustc-serialize@0.3.24 (crates.io) is affected by RUSTSEC-2025-0025","path":"Cargo.lock","line":null,"fingerprint":"rustc-serialize@0.3.24 (crates.io):RUSTSEC-2025-0025"},{"rule_id":"osv/RUSTSEC-2023-0081","severity":"medium","message":"safemem@0.2.0 (crates.io) is affected by RUSTSEC-2023-0081","path":"Cargo.lock","line":null,"fingerprint":"safemem@0.2.0 (crates.io):RUSTSEC-2023-0081"},{"rule_id":"osv/RUSTSEC-2018-0015","severity":"medium","message":"term@0.4.6 (crates.io) is affected by RUSTSEC-2018-0015","path":"Cargo.lock","line":null,"fingerprint":"term@0.4.6 (crates.io):RUSTSEC-2018-0015"},{"rule_id":"osv/GHSA-9hpw-r23r-xgm5","severity":"medium","message":"thread_local@0.3.4 (crates.io) is affected by RUSTSEC-2022-0006, GHSA-9hpw-r23r-xgm5","path":"Cargo.lock","line":null,"fingerprint":"thread_local@0.3.4 (crates.io):GHSA-9hpw-r23r-xgm5"},{"rule_id":"osv/GHSA-wcg3-cvx6-7396","severity":"medium","message":"time@0.1.38 (crates.io) is affected by RUSTSEC-2020-0071, GHSA-wcg3-cvx6-7396","path":"Cargo.lock","line":null,"fingerprint":"time@0.1.38 (crates.io):GHSA-wcg3-cvx6-7396"},{"rule_id":"osv/RUSTSEC-2026-0058","severity":"medium","message":"tokio-io@0.1.2 (crates.io) is affected by RUSTSEC-2026-0058","path":"Cargo.lock","line":null,"fingerprint":"tokio-io@0.1.2 (crates.io):RUSTSEC-2026-0058"},{"rule_id":"osv/RUSTSEC-2020-0162","severity":"medium","message":"tokio-proto@0.1.1 (crates.io) is affected by RUSTSEC-2020-0162","path":"Cargo.lock","line":null,"fingerprint":"tokio-proto@0.1.1 (crates.io):RUSTSEC-2020-0162"},{"rule_id":"osv/RUSTSEC-2026-0065","severity":"medium","message":"tokio-signal@0.1.2 (crates.io) is affected by RUSTSEC-2026-0065","path":"Cargo.lock","line":null,"fingerprint":"tokio-signal@0.1.2 (crates.io):RUSTSEC-2026-0065"},{"rule_id":"osv/GHSA-2p6r-x3vv-xqm2","severity":"low","message":"rpassword@0.3.1 (crates.io) is affected by GHSA-2p6r-x3vv-xqm2","path":"Cargo.lock","line":null,"fingerprint":"rpassword@0.3.1 (crates.io):GHSA-2p6r-x3vv-xqm2"}],"evidence":[],"data":{"ecosystems":["crates.io"]},"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":0.0,"signed_commit_share":0.0,"unpinned_manifests":4.0},"findings":[],"evidence":[{"kind":"posture","description":"audio/Cargo.toml has no lockfile alongside it (unpinned dependencies)","ref":"audio/Cargo.toml","url":null,"weight":0.3},{"kind":"posture","description":"core/Cargo.toml has no lockfile alongside it (unpinned dependencies)","ref":"core/Cargo.toml","url":null,"weight":0.3},{"kind":"posture","description":"metadata/Cargo.toml has no lockfile alongside it (unpinned dependencies)","ref":"metadata/Cargo.toml","url":null,"weight":0.3},{"kind":"posture","description":"protocol/Cargo.toml has no lockfile alongside it (unpinned dependencies)","ref":"protocol/Cargo.toml","url":null,"weight":0.3}],"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":289.0,"function_nloc":3226.0,"mean_ccn":2.12,"p90_ccn":4.0,"complex_functions":2.0,"long_functions":1.0,"many_param_functions":0.0,"risky_nloc_share":0.0843},"findings":[],"evidence":[{"kind":"complex-function","description":"handle_frame in src/spirc.rs: complexity 21, 89 lines","ref":"src/spirc.rs","url":"https://github.com/plietar/librespot/blob/8971d3aa6864469a79c2640bb2afaf41c3d3728d/src/spirc.rs#L325","weight":0.35},{"kind":"complex-function","description":"handle_command in src/player.rs: complexity 20, 82 lines","ref":"src/player.rs","url":"https://github.com/plietar/librespot/blob/8971d3aa6864469a79c2640bb2afaf41c3d3728d/src/player.rs#L226","weight":0.3333333333333333},{"kind":"complex-function","description":" in src/main.rs: complexity 3, 101 lines","ref":"src/main.rs","url":"https://github.com/plietar/librespot/blob/8971d3aa6864469a79c2640bb2afaf41c3d3728d/src/main.rs#L78","weight":0.05}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":3265.0,"duplicated_lines":36.0,"duplicated_share":0.011,"files":52.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: audio/src/lewton_decoder.rs:53 and audio/src/libvorbis_decoder.rs:56","ref":"audio/src/lewton_decoder.rs","url":"https://github.com/plietar/librespot/blob/8971d3aa6864469a79c2640bb2afaf41c3d3728d/audio/src/lewton_decoder.rs#L53","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/spirc.rs:469 and src/spirc.rs:523","ref":"src/spirc.rs","url":"https://github.com/plietar/librespot/blob/8971d3aa6864469a79c2640bb2afaf41c3d3728d/src/spirc.rs#L469","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":5423.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":"protocol/build.sh","line":21,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:protocol/build.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":"protocol/build.sh","line":23,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:protocol/build.sh:23"}],"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":5423.0,"test_ratio":0.0,"ci_files":1.0,"cochange_share":0.0,"cochange_commits":224.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":84.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":[]}