{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:03.637718Z","repo":{"ref":{"host":"github.com","owner":"craigloewen-msft","name":"guitar-practice-tool"},"default_branch":"main","clone_url":"https://github.com/craigloewen-msft/guitar-practice-tool.git","html_url":"https://github.com/craigloewen-msft/guitar-practice-tool","description":"Offline Guitar Pro tab player and practice tool with Neural Amp Modeler guitar tone, written in Rust","stars":1,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":405,"primary_language":"Rust","license_spdx":"Apache-2.0","created_at":"2026-10-11T01:45:08Z","pushed_at":"2026-10-29T15:09:32Z","security_policy_url":null,"distribution":{"owner_created_at":"2018-08-08T21:10:57Z","owner_type":"User","release_assets":[{"name":"guitar-practice-tool_0.1.0_amd64.deb","size":9345658,"download_count":0,"release_tag":"v0.1.0","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/guitar-practice-tool_0.1.0_amd64.deb"},{"name":"guitar-practice-tool_0.1.0_x64-setup.exe","size":6948341,"download_count":1,"release_tag":"v0.1.0","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/guitar-practice-tool_0.1.0_x64-setup.exe"},{"name":"guitar-practice-tool_0.1.0_x86_64.AppImage","size":9554424,"download_count":0,"release_tag":"v0.1.0","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/guitar-practice-tool_0.1.0_x86_64.AppImage"},{"name":"Guitar.Practice.Tool_0.1.0_aarch64.dmg","size":6218930,"download_count":1,"release_tag":"v0.1.0","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/Guitar.Practice.Tool_0.1.0_aarch64.dmg"},{"name":"Guitar.Practice.Tool_0.1.0_x64.dmg","size":6710749,"download_count":0,"release_tag":"v0.1.0","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/Guitar.Practice.Tool_0.1.0_x64.dmg"}]}},"commit_sha":"269dc8199607d3a0fac4b757b2367eb0cef419e7","profile":{"lines_by_language":{"Rust":12105},"files_by_category":{"source":21,"binary":8,"config":5,"docs":3,"generated":1,"other":1},"source_lines":12105,"test_lines":0},"pillars":{"ai_provenance":{"score":100.0,"confidence":0.73,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":1.0,"suspected_share":0.0,"estimated_share":1.0,"ai_artifacts":0.0,"flagged_work_units":2.0,"flagged_releases":null,"style_index":0.743},"summary":"Explicit AI attribution on 100% of first-party code added; an estimated 100% including velocity signals."},"quality":{"score":59.5,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":27.2,"duplication":99.2,"lint":100.0,"testing":35.0,"docs":65.0,"type_safety":null,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.00, CI runs tests; 43% of function code in complex or long functions; 0% duplicated lines. Weakest area: complexity."},"security":{"score":65.5,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":100.0,"sast":98.6,"dependencies":63.8,"ci_actions":9.6,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 12 known vulnerabilities in 9 dependencies; 12 high-severity workflow issues. 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":16.0,"checked":16.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":11.0,"attributed_commits":10.0,"attributed_commit_share":0.9090909090909091,"effective_loc":13395.0,"attributed_loc":13395.0,"attributed_loc_share":1.0,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"GitHub Copilot coding agent: 10 attributed commits, 13,395 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"269dc8199607d3a0fac4b757b2367eb0cef419e7","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/269dc8199607d3a0fac4b757b2367eb0cef419e7","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"6f220c2133f5c8d89819ee5c09e8a723541ed2e7","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/6f220c2133f5c8d89819ee5c09e8a723541ed2e7","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"34925619d8d79b82a3f87cdbdeae7fe7a502ee29","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/34925619d8d79b82a3f87cdbdeae7fe7a502ee29","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"a2839208cd0cdb05afd9f66336f440f6601b0684","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/a2839208cd0cdb05afd9f66336f440f6601b0684","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"296385520bf8fbb9b9334f0dc249e4a0fa71f5ee","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/296385520bf8fbb9b9334f0dc249e4a0fa71f5ee","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"0d78a68edaa2abae926e7d3aef57eaee4e890068","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/0d78a68edaa2abae926e7d3aef57eaee4e890068","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"9a48ab09a61213f9557eb041d2fd0655ef7e78d3","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/9a48ab09a61213f9557eb041d2fd0655ef7e78d3","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"2b5a37a1e83c3e5828a347450d44e5395d9c4d5d","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/2b5a37a1e83c3e5828a347450d44e5395d9c4d5d","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"8624017078b19aa01a501cc71d6e4f1cab0a0453","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/8624017078b19aa01a501cc71d6e4f1cab0a0453","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"860cfeb828ff6837f9ffdf79d71e8d658be51da9","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/860cfeb828ff6837f9ffdf79d71e8d658be51da9","weight":0.9}],"data":{"attributed_loc_by_commit":{"860cfeb828ff6837f9ffdf79d71e8d658be51da9":5215,"8624017078b19aa01a501cc71d6e4f1cab0a0453":1093,"2b5a37a1e83c3e5828a347450d44e5395d9c4d5d":1655,"9a48ab09a61213f9557eb041d2fd0655ef7e78d3":1131,"0d78a68edaa2abae926e7d3aef57eaee4e890068":308,"296385520bf8fbb9b9334f0dc249e4a0fa71f5ee":226,"a2839208cd0cdb05afd9f66336f440f6601b0684":0,"34925619d8d79b82a3f87cdbdeae7fe7a502ee29":3227,"6f220c2133f5c8d89819ee5c09e8a723541ed2e7":32,"269dc8199607d3a0fac4b757b2367eb0cef419e7":508},"tools":{"github-copilot":{"name":"GitHub Copilot coding agent","commits":10,"loc":13395,"first_seen":1791607463,"last_seen":1793286075}},"monthly":{"2026-10":{"loc":13395,"attributed_loc":13395}}},"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":5.0,"flagged_units":2.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":8180.0,"flagged_loc":5975.0,"flagged_loc_share":0.730440097799511,"max_loc_per_hour":806.75,"median_loc_per_hour":419.64636542239685,"pr_timed_units":0.0,"excluded_import_loc":5215.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"3,227 lines of first-party code in ~4.0h (807 lines/hour, 1 commit session)","ref":"34925619d8d79b82a3f87cdbdeae7fe7a502ee29","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/34925619d8d79b82a3f87cdbdeae7fe7a502ee29","weight":0.242025},{"kind":"velocity-burst","description":"2,748 lines of first-party code in ~4.5h (613 lines/hour, 2 commit session)","ref":"2b5a37a1e83c3e5828a347450d44e5395d9c4d5d","url":"https://github.com/craigloewen-msft/guitar-practice-tool/commit/2b5a37a1e83c3e5828a347450d44e5395d9c4d5d","weight":0.1838354806739346}],"data":{"flagged_loc_by_commit":{"8624017078b19aa01a501cc71d6e4f1cab0a0453":1093,"2b5a37a1e83c3e5828a347450d44e5395d9c4d5d":1655,"34925619d8d79b82a3f87cdbdeae7fe7a502ee29":3227},"excluded_import_commits":["860cfeb828ff6837f9ffdf79d71e8d658be51da9"]},"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":12105.0,"index":0.743,"count:narrated_steps":5.0,"per_kloc:narrated_steps":0.413,"files:narrated_steps":1.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":8.0,"per_kloc:emoji_in_code":0.661,"files:emoji_in_code":3.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: // Step 1: structure. Match the whole song at once by what each part is doing - which parts","ref":"src/backing.rs:1301","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/backing.rs#L1301","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: // Step 2: hits. Place the tab's hits where the structure says they fall, and slide each","ref":"src/backing.rs:1348","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/backing.rs#L1348","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: // Step 3: the map playback follows. Every point is measured, so there is no single tempo for","ref":"src/backing.rs:1454","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/backing.rs#L1454","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: // Step 4: report each window as a check on the structure match.","ref":"src/backing.rs:1471","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/backing.rs#L1471","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: // Step 5: with the map settled, ask the blunt question - do the hits land together? A","ref":"src/backing.rs:1504","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/backing.rs#L1504","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":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":2.0,"findings_high":0.0,"findings_medium":0.0,"findings_low":2.0,"weighted_findings":0.5,"scanned_lines":12105.0,"parse_errors":1.0},"findings":[{"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":220,"fingerprint":"rust.lang.security.args:src/main.rs:220"},{"rule_id":"opengrep/rust.lang.security.current-exe","severity":"low","message":"current_exe should not be used for security operations. From the docs: \"The output of this function should not be trusted for anything that might have security implications. Basically, if users can run the executable, they can change the output arbitrarily.\" [confidence high]","path":"src/synth/sampler.rs","line":593,"fingerprint":"rust.lang.security.current-exe:src/synth/sampler.rs:593"}],"evidence":[],"data":{"rulesets":["rust"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":9.0,"vulnerabilities":12.0,"vulns_critical":0.0,"vulns_high":0.0,"vulns_medium":1.0,"vulns_low":3.0,"vulns_unknown":8.0,"penalty":27.0},"findings":[{"rule_id":"osv/RUSTSEC-2026-0486","severity":"medium","message":"rustix@1.1.5 (crates.io) is affected by RUSTSEC-2026-0486","path":"Cargo.lock","line":null,"fingerprint":"rustix@1.1.5 (crates.io):RUSTSEC-2026-0486"},{"rule_id":"osv/GHSA-c8m5-c952-6cm4","severity":"medium","message":"rustls@0.23.45 (crates.io) is affected by RUSTSEC-2026-0346, GHSA-c8m5-c952-6cm4","path":"Cargo.lock","line":null,"fingerprint":"rustls@0.23.45 (crates.io):GHSA-c8m5-c952-6cm4"},{"rule_id":"osv/RUSTSEC-2026-0382","severity":"medium","message":"rustls-webpki@0.103.15 (crates.io) is affected by RUSTSEC-2026-0382","path":"Cargo.lock","line":null,"fingerprint":"rustls-webpki@0.103.15 (crates.io):RUSTSEC-2026-0382"},{"rule_id":"osv/RUSTSEC-2026-0386","severity":"medium","message":"tokio@1.53.2 (crates.io) is affected by RUSTSEC-2026-0386","path":"Cargo.lock","line":null,"fingerprint":"tokio@1.53.2 (crates.io):RUSTSEC-2026-0386"},{"rule_id":"osv/RUSTSEC-2026-0192","severity":"medium","message":"ttf-parser@0.25.1 (crates.io) is affected by RUSTSEC-2026-0192","path":"Cargo.lock","line":null,"fingerprint":"ttf-parser@0.25.1 (crates.io):RUSTSEC-2026-0192"},{"rule_id":"osv/RUSTSEC-2026-0381","severity":"medium","message":"webpki-roots@1.0.9 (crates.io) is affected by RUSTSEC-2026-0381","path":"Cargo.lock","line":null,"fingerprint":"webpki-roots@1.0.9 (crates.io):RUSTSEC-2026-0381"},{"rule_id":"osv/RUSTSEC-2026-0371","severity":"medium","message":"zbus_names@4.3.4 (crates.io) is affected by RUSTSEC-2026-0371","path":"Cargo.lock","line":null,"fingerprint":"zbus_names@4.3.4 (crates.io):RUSTSEC-2026-0371"},{"rule_id":"osv/RUSTSEC-2026-0370","severity":"medium","message":"zvariant@5.15.0 (crates.io) is affected by RUSTSEC-2026-0370","path":"Cargo.lock","line":null,"fingerprint":"zvariant@5.15.0 (crates.io):RUSTSEC-2026-0370"},{"rule_id":"osv/RUSTSEC-2026-0372","severity":"medium","message":"zvariant_derive@5.15.0 (crates.io) is affected by RUSTSEC-2026-0372","path":"Cargo.lock","line":null,"fingerprint":"zvariant_derive@5.15.0 (crates.io):RUSTSEC-2026-0372"},{"rule_id":"osv/GHSA-vp88-798v-h67f","severity":"low","message":"rustls@0.23.45 (crates.io) is affected by RUSTSEC-2026-0347, GHSA-vp88-798v-h67f","path":"Cargo.lock","line":null,"fingerprint":"rustls@0.23.45 (crates.io):GHSA-vp88-798v-h67f"},{"rule_id":"osv/GHSA-h2v8-394m-p7vv","severity":"low","message":"rustls@0.23.45 (crates.io) is affected by RUSTSEC-2026-0348, GHSA-h2v8-394m-p7vv","path":"Cargo.lock","line":null,"fingerprint":"rustls@0.23.45 (crates.io):GHSA-h2v8-394m-p7vv"},{"rule_id":"osv/GHSA-w44r-93j7-qv28","severity":"low","message":"rustls@0.23.45 (crates.io) is affected by RUSTSEC-2026-0349, GHSA-w44r-93j7-qv28","path":"Cargo.lock","line":null,"fingerprint":"rustls@0.23.45 (crates.io):GHSA-w44r-93j7-qv28"}],"evidence":[],"data":{"ecosystems":["crates.io"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":2.0,"findings":16.0,"findings_high":12.0,"findings_medium":3.0,"findings_low":1.0,"penalty":140.4},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":16,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:16"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":17,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:17"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/ci.yml","line":18,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:18"},{"rule_id":"zizmor/excessive-permissions","severity":"high","message":"overly broad permissions [confidence high]","path":".github/workflows/release.yml","line":9,"fingerprint":"excessive-permissions:.github/workflows/release.yml:9"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":33,"fingerprint":"unpinned-uses:.github/workflows/release.yml:33"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":34,"fingerprint":"unpinned-uses:.github/workflows/release.yml:34"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":37,"fingerprint":"unpinned-uses:.github/workflows/release.yml:37"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":43,"fingerprint":"unpinned-uses:.github/workflows/release.yml:43"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":49,"fingerprint":"unpinned-uses:.github/workflows/release.yml:49"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":64,"fingerprint":"unpinned-uses:.github/workflows/release.yml:64"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":68,"fingerprint":"unpinned-uses:.github/workflows/release.yml:68"},{"rule_id":"zizmor/cache-poisoning","severity":"high","message":"runtime artifacts potentially vulnerable to a cache poisoning attack [confidence low]","path":".github/workflows/release.yml","line":37,"fingerprint":"cache-poisoning:.github/workflows/release.yml:37"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/ci.yml","line":16,"fingerprint":"artipacked:.github/workflows/ci.yml:16"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/ci.yml","line":9,"fingerprint":"excessive-permissions:.github/workflows/ci.yml:9"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/release.yml","line":33,"fingerprint":"artipacked:.github/workflows/release.yml:33"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/release.yml","line":68,"fingerprint":"superfluous-actions:.github/workflows/release.yml:68"}],"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":1.0,"binary_assets":5.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v0.1.0 ships guitar-practice-tool_0.1.0_amd64.deb (0 downloads)","ref":"guitar-practice-tool_0.1.0_amd64.deb","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/guitar-practice-tool_0.1.0_amd64.deb","weight":0.0},{"kind":"binary-release-asset","description":"release v0.1.0 ships guitar-practice-tool_0.1.0_x64-setup.exe (1 downloads)","ref":"guitar-practice-tool_0.1.0_x64-setup.exe","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/guitar-practice-tool_0.1.0_x64-setup.exe","weight":0.0},{"kind":"binary-release-asset","description":"release v0.1.0 ships guitar-practice-tool_0.1.0_x86_64.AppImage (0 downloads)","ref":"guitar-practice-tool_0.1.0_x86_64.AppImage","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/guitar-practice-tool_0.1.0_x86_64.AppImage","weight":0.0},{"kind":"binary-release-asset","description":"release v0.1.0 ships Guitar.Practice.Tool_0.1.0_aarch64.dmg (1 downloads)","ref":"Guitar.Practice.Tool_0.1.0_aarch64.dmg","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/Guitar.Practice.Tool_0.1.0_aarch64.dmg","weight":0.0},{"kind":"binary-release-asset","description":"release v0.1.0 ships Guitar.Practice.Tool_0.1.0_x64.dmg (0 downloads)","ref":"Guitar.Practice.Tool_0.1.0_x64.dmg","url":"https://github.com/craigloewen-msft/guitar-practice-tool/releases/download/v0.1.0/Guitar.Practice.Tool_0.1.0_x64.dmg","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":432.0,"function_nloc":9240.0,"mean_ccn":5.91,"p90_ccn":16.0,"complex_functions":47.0,"long_functions":16.0,"many_param_functions":3.0,"risky_nloc_share":0.4344},"findings":[],"evidence":[{"kind":"complex-function","description":"parse in src/gp.rs: complexity 61, 102 lines","ref":"src/gp.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/gp.rs#L114","weight":1.0},{"kind":"complex-function","description":"read_note_effects in src/gp.rs: complexity 58, 117 lines","ref":"src/gp.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/gp.rs#L716","weight":0.9666666666666667},{"kind":"complex-function","description":"schedule_beat in src/timeline.rs: complexity 54, 243 lines","ref":"src/timeline.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/timeline.rs#L330","weight":0.9},{"kind":"complex-function","description":"process_block in src/synth/mod.rs: complexity 53, 187 lines","ref":"src/synth/mod.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/synth/mod.rs#L664","weight":0.8833333333333333},{"kind":"complex-function","description":"align in src/backing.rs: complexity 47, 234 lines","ref":"src/backing.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/backing.rs#L1263","weight":0.7833333333333333},{"kind":"complex-function","description":"read_track in src/gp.rs: complexity 41, 60 lines","ref":"src/gp.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/gp.rs#L339","weight":0.6833333333333333},{"kind":"complex-function","description":"handle in src/synth/mod.rs: complexity 41, 111 lines","ref":"src/synth/mod.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/synth/mod.rs#L225","weight":0.6833333333333333},{"kind":"complex-function","description":"parse_layer_array in src/synth/nam.rs: complexity 38, 104 lines","ref":"src/synth/nam.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/synth/nam.rs#L362","weight":0.6333333333333333},{"kind":"complex-function","description":"read_measure_header in src/gp.rs: complexity 37, 77 lines","ref":"src/gp.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/gp.rs#L261","weight":0.6166666666666667},{"kind":"complex-function","description":"tab_view in src/ui/mod.rs: complexity 34, 109 lines","ref":"src/ui/mod.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/ui/mod.rs#L1010","weight":0.5666666666666667}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":9111.0,"duplicated_lines":12.0,"duplicated_share":0.0013,"files":21.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: src/timeline.rs:554 and src/timeline.rs:569","ref":"src/timeline.rs","url":"https://github.com/craigloewen-msft/guitar-practice-tool/blob/269dc8199607d3a0fac4b757b2367eb0cef419e7/src/timeline.rs#L554","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":0.0,"weighted_findings":0.0,"scanned_lines":12105.0},"findings":[],"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":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.0,"test_lines":0.0,"source_lines":12105.0,"test_ratio":0.0,"ci_files":2.0,"cochange_share":0.0,"cochange_commits":9.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/ci.yml","ref":".github/workflows/ci.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/release.yml","ref":".github/workflows/release.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (go test, cargo test)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["go test","cargo 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":0.0,"check:changelog":0.0,"readme_lines":29.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.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":12105.0,"other_lines":0.0,"files_blamed":21.0,"blame_failures":0.0,"quality:ai_findings":0.0,"quality:ai_per_kloc":0.0,"quality:other_findings":0.0,"security:ai_findings":2.0,"security:ai_per_kloc":0.165,"security:other_findings":0.0},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":["unreviewed-ai-risk"]}