{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:06.226805Z","repo":{"ref":{"host":"github.com","owner":"mambucodev","name":"votetracker"},"default_branch":"main","clone_url":"https://github.com/mambucodev/votetracker.git","html_url":"https://github.com/mambucodev/votetracker","description":"A school grade management application built with Python and PySide6 (Qt6).","stars":1,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":1192,"primary_language":"Python","license_spdx":"MIT","created_at":"2026-01-15T22:37:05Z","pushed_at":"2026-10-04T00:17:31Z","security_policy_url":null,"distribution":{"owner_created_at":"2021-01-12T18:57:58Z","owner_type":"User","release_assets":[{"name":"votetracker-2.9.0-1-any.pkg.tar.zst","size":384797,"download_count":5,"release_tag":"v2.9.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.9.0/votetracker-2.9.0-1-any.pkg.tar.zst"},{"name":"VoteTracker-Linux","size":90227072,"download_count":13,"release_tag":"v2.9.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.9.0/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44559744,"download_count":6,"release_tag":"v2.9.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.9.0/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":59581384,"download_count":3,"release_tag":"v2.9.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.9.0/VoteTracker-Windows.exe"},{"name":"VoteTracker-Linux","size":90244344,"download_count":7,"release_tag":"v2.8.2","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.2/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44788736,"download_count":8,"release_tag":"v2.8.2","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.2/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":59623055,"download_count":4,"release_tag":"v2.8.2","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.2/VoteTracker-Windows.exe"},{"name":"VoteTracker-Linux","size":90200936,"download_count":5,"release_tag":"v2.8.1","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.1/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44723504,"download_count":3,"release_tag":"v2.8.1","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.1/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":59597466,"download_count":1,"release_tag":"v2.8.1","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.1/VoteTracker-Windows.exe"},{"name":"VoteTracker-Linux","size":90201944,"download_count":4,"release_tag":"v2.8.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.0/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44723248,"download_count":3,"release_tag":"v2.8.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.0/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":59596799,"download_count":4,"release_tag":"v2.8.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.0/VoteTracker-Windows.exe"},{"name":"VoteTracker-Linux","size":89618952,"download_count":2,"release_tag":"v2.7.1","url":"https://github.com/mambucodev/votetracker/releases/download/v2.7.1/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44136416,"download_count":1,"release_tag":"v2.7.1","url":"https://github.com/mambucodev/votetracker/releases/download/v2.7.1/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":59013510,"download_count":1,"release_tag":"v2.7.1","url":"https://github.com/mambucodev/votetracker/releases/download/v2.7.1/VoteTracker-Windows.exe"},{"name":"VoteTracker-Linux","size":89604240,"download_count":4,"release_tag":"v2.7.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.7.0/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44119984,"download_count":2,"release_tag":"v2.7.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.7.0/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":58999360,"download_count":1,"release_tag":"v2.7.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.7.0/VoteTracker-Windows.exe"},{"name":"VoteTracker-Linux","size":89546240,"download_count":4,"release_tag":"v2.6.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.6.0/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44054208,"download_count":4,"release_tag":"v2.6.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.6.0/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":58933025,"download_count":3,"release_tag":"v2.6.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.6.0/VoteTracker-Windows.exe"},{"name":"VoteTracker-Linux","size":89542184,"download_count":2,"release_tag":"v2.5.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.5.0/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44052912,"download_count":2,"release_tag":"v2.5.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.5.0/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":58929316,"download_count":1,"release_tag":"v2.5.0","url":"https://github.com/mambucodev/votetracker/releases/download/v2.5.0/VoteTracker-Windows.exe"},{"name":"VoteTracker-Linux","size":89497312,"download_count":1,"release_tag":"v2.4.2","url":"https://github.com/mambucodev/votetracker/releases/download/v2.4.2/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44027920,"download_count":1,"release_tag":"v2.4.2","url":"https://github.com/mambucodev/votetracker/releases/download/v2.4.2/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":58902851,"download_count":0,"release_tag":"v2.4.2","url":"https://github.com/mambucodev/votetracker/releases/download/v2.4.2/VoteTracker-Windows.exe"},{"name":"VoteTracker-Linux","size":89495440,"download_count":1,"release_tag":"v2.4.1","url":"https://github.com/mambucodev/votetracker/releases/download/v2.4.1/VoteTracker-Linux"},{"name":"VoteTracker-macOS","size":44025328,"download_count":1,"release_tag":"v2.4.1","url":"https://github.com/mambucodev/votetracker/releases/download/v2.4.1/VoteTracker-macOS"},{"name":"VoteTracker-Windows.exe","size":58900172,"download_count":1,"release_tag":"v2.4.1","url":"https://github.com/mambucodev/votetracker/releases/download/v2.4.1/VoteTracker-Windows.exe"}]}},"commit_sha":"2097876e77b7637efdd19b5ed03020c48883c213","profile":{"lines_by_language":{"Python":12814,"Rust":2606,"Shell":98},"files_by_category":{"source":49,"docs":17,"test":14,"binary":10,"config":8,"other":8,"generated":1},"source_lines":13766,"test_lines":1752},"pillars":{"ai_provenance":{"score":33.6,"confidence":0.95,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.3358,"suspected_share":0.3026,"estimated_share":0.3358,"ai_artifacts":3.0,"flagged_work_units":2.0,"flagged_releases":0.0,"style_index":0.436},"summary":"Explicit AI attribution on 34% of first-party code added; an estimated 34% including velocity signals."},"quality":{"score":66.4,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":52.2,"duplication":72.7,"lint":94.7,"testing":63.0,"docs":65.0,"type_safety":40.0,"process":null},"summary":"Code quality is adequate: test-to-source ratio 0.13, CI runs tests; 22% of function code in complex or long functions; 5% duplicated lines. Weakest area: type safety."},"security":{"score":68.5,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":96.7,"sast":98.1,"dependencies":86.1,"ci_actions":4.4,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 3 known vulnerabilities in 3 dependencies; 1 high-severity SAST findings; 14 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":15.0,"checked":15.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":153.0,"attributed_commits":62.0,"attributed_commit_share":0.40522875816993464,"effective_loc":19586.0,"attributed_loc":6577.0,"attributed_loc_share":0.3358010824058001,"tools_detected":2.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 43 attributed commits, 5,798 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attribution-summary","description":"Jules: 19 attributed commits, 779 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"eea888ac50fae9a3c6473a99aa13fc4e999cf1cf","url":"https://github.com/mambucodev/votetracker/commit/eea888ac50fae9a3c6473a99aa13fc4e999cf1cf","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"69879b4d94ecf3698b78d47ca014fec1c0fd6a54","url":"https://github.com/mambucodev/votetracker/commit/69879b4d94ecf3698b78d47ca014fec1c0fd6a54","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"4d65bb01ed5e30718ae2074b8ecb9f3812b617a6","url":"https://github.com/mambucodev/votetracker/commit/4d65bb01ed5e30718ae2074b8ecb9f3812b617a6","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"aff2703ff449bfc5d86fa700424815349b9950ca","url":"https://github.com/mambucodev/votetracker/commit/aff2703ff449bfc5d86fa700424815349b9950ca","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"5372e211e33caf08989f4bc7c0ba068456169b41","url":"https://github.com/mambucodev/votetracker/commit/5372e211e33caf08989f4bc7c0ba068456169b41","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"83ed6361353a2e0ebad094e9302b2eeaaf03aa86","url":"https://github.com/mambucodev/votetracker/commit/83ed6361353a2e0ebad094e9302b2eeaaf03aa86","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"8680a40a3c76da9fd98bb270fa8590ead01022ef","url":"https://github.com/mambucodev/votetracker/commit/8680a40a3c76da9fd98bb270fa8590ead01022ef","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"79e7b3f5b4a5b754da10903c2f649e4ab6ff0cbd","url":"https://github.com/mambucodev/votetracker/commit/79e7b3f5b4a5b754da10903c2f649e4ab6ff0cbd","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"9f098bffb351649542287c02d1fa61530fbc276e","url":"https://github.com/mambucodev/votetracker/commit/9f098bffb351649542287c02d1fa61530fbc276e","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"3a474d39bee543fcb15e6c8e12a2755ecbfe5981","url":"https://github.com/mambucodev/votetracker/commit/3a474d39bee543fcb15e6c8e12a2755ecbfe5981","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"6d5cda52a7bac4819887560b18bf8ac7fd3a3066","url":"https://github.com/mambucodev/votetracker/commit/6d5cda52a7bac4819887560b18bf8ac7fd3a3066","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"cbdf62f1a4a19821604dac7b5c1a6f00412f0cc5","url":"https://github.com/mambucodev/votetracker/commit/cbdf62f1a4a19821604dac7b5c1a6f00412f0cc5","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"231f56594cd13da0016e814038b2b030ace5d836","url":"https://github.com/mambucodev/votetracker/commit/231f56594cd13da0016e814038b2b030ace5d836","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"80509bbabb55ee98b2f31b4bc433bda60b10b088","url":"https://github.com/mambucodev/votetracker/commit/80509bbabb55ee98b2f31b4bc433bda60b10b088","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"29de104e4cd87b51b016e82e4d488cd352c63a37","url":"https://github.com/mambucodev/votetracker/commit/29de104e4cd87b51b016e82e4d488cd352c63a37","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"1ed9f0f7a03afa22244c30a182fe33f1bdb90da4","url":"https://github.com/mambucodev/votetracker/commit/1ed9f0f7a03afa22244c30a182fe33f1bdb90da4","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"2a40883bf0d8daf39b5ddefb62ef411e3d3c619a","url":"https://github.com/mambucodev/votetracker/commit/2a40883bf0d8daf39b5ddefb62ef411e3d3c619a","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"f64f932e7749413920dfa35167f368b575b4272b","url":"https://github.com/mambucodev/votetracker/commit/f64f932e7749413920dfa35167f368b575b4272b","weight":0.9},{"kind":"attributed-commit","description":"Jules: author google-labs-jules[bot]","ref":"2a1a9aa81b379852d54392818f469d22ba0d3188","url":"https://github.com/mambucodev/votetracker/commit/2a1a9aa81b379852d54392818f469d22ba0d3188","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"3c53a1dadee79907f136653a48501bc2cae4ec83","url":"https://github.com/mambucodev/votetracker/commit/3c53a1dadee79907f136653a48501bc2cae4ec83","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"827de403dd36d11af218b8a37cab2322f2ad54ef","url":"https://github.com/mambucodev/votetracker/commit/827de403dd36d11af218b8a37cab2322f2ad54ef","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"5401692cae86f6cdbd4820e16dc906057492ff64","url":"https://github.com/mambucodev/votetracker/commit/5401692cae86f6cdbd4820e16dc906057492ff64","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"f7b0f389b27241d62f298419d3005657b4d6dec0","url":"https://github.com/mambucodev/votetracker/commit/f7b0f389b27241d62f298419d3005657b4d6dec0","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"1c81411d3f4e6f0f2766562c5e13974c6edead21","url":"https://github.com/mambucodev/votetracker/commit/1c81411d3f4e6f0f2766562c5e13974c6edead21","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"0d069221c91d6c565bec3243b9f7db882c471bd5","url":"https://github.com/mambucodev/votetracker/commit/0d069221c91d6c565bec3243b9f7db882c471bd5","weight":0.9}],"data":{"attributed_loc_by_commit":{"53fe3256f7dc6d72b6545aee31daec907c71eb3d":5,"d179fd1f5ff26b372474eac115239c060a8afbb6":122,"112c29dc76cff9a663f3637b1a5976eca694d4c0":0,"d21b43d2d77c121a763717beb170e93c806df5b9":293,"c725b6de8bb5d0a7663c3a0139921c953e672689":312,"b99769774eacaf078611e505cd2b5682760089a8":1,"b41f6f3d5e88a9c4f201a2df1323ab7b7fe31a54":224,"11c024e6f26b794e4d822dca8c005d70b044f59f":408,"d50ee8b54c150e6f20ddbb3e1355a4f767410437":45,"ee4eefa88374d697aaabfccd69f5199e2f1498be":4,"4741f6377acd22c327dfc102b9a00ff962934e1e":0,"43d31a24fccd89d4e5b32d3a7a92a6ec9ccfeb8b":11,"a7b886a9b2983410a67ded037b93c653dd8c2b08":129,"9738a3b36898a9a828f81cf4c5ef95168252e523":909,"bdaae77cdd75ed9dc04b5acb49e3a4e2eb06326a":31,"c2bbf740ea20bec4b9a7d823025cbd8db25a3191":16,"579d34ed6b3999169133a737d2fe6178db823c4a":66,"d9720148fb244b7aa21fb2c097a5c374b8b68fb2":1322,"c1e9805b051e830360786e52f7e506cbed970e13":47,"bb7573f13cd6e07bb5885b236c845f1aee467279":4,"384e204b4e81a6e4e028668416c8e7ab5f05cc04":0,"ffebd6c6020646b024f1a6950b4cd66d323ad2c8":228,"216db18dfacfcef11a96fa4fe316bdba4d566079":413,"954bfa6d380d38966968bb13d739c6278e0fafaa":0,"1766b7c803a71022d9b20cdb80ffeebc024e6f89":26,"2dccca396b92616a9917f3ac158120a56e65df1d":0,"e360e9250cd3f5a679cf5adeb9fc57fa1cef6772":0,"4c3d9b242ed290d611f7b2f57cae118dfee1b89d":0,"23dd01382114b89b6e68a5fc70131f194347972f":292,"3d9a3533214362615c322359fd3f2c8b8a6dbe6b":94,"6e605df719a1e84513c1e347d4f3c514dac2f69e":30,"2df4a1ebfcf1d73a1c3778d803d69f26dc53c988":92,"10eba0cd9169a142a9a8b7baa3501cf8cc62c4aa":42,"c856f24389fb74fe858346422ac013ad8abb2af7":130,"2126b19b2306043efbabcc0a55e2cb53c7c3b0cd":186,"ed55c5d783e4091b7039bc4cd138c393cf26d32f":13,"be28823fac89f3e0d97c5a0bc7cc537c0af18c58":56,"0d069221c91d6c565bec3243b9f7db882c471bd5":8,"1c81411d3f4e6f0f2766562c5e13974c6edead21":0,"f7b0f389b27241d62f298419d3005657b4d6dec0":15,"5401692cae86f6cdbd4820e16dc906057492ff64":0,"827de403dd36d11af218b8a37cab2322f2ad54ef":199,"3c53a1dadee79907f136653a48501bc2cae4ec83":25,"2a1a9aa81b379852d54392818f469d22ba0d3188":4,"f64f932e7749413920dfa35167f368b575b4272b":8,"2a40883bf0d8daf39b5ddefb62ef411e3d3c619a":8,"1ed9f0f7a03afa22244c30a182fe33f1bdb90da4":131,"29de104e4cd87b51b016e82e4d488cd352c63a37":18,"80509bbabb55ee98b2f31b4bc433bda60b10b088":14,"231f56594cd13da0016e814038b2b030ace5d836":4,"cbdf62f1a4a19821604dac7b5c1a6f00412f0cc5":40,"6d5cda52a7bac4819887560b18bf8ac7fd3a3066":82,"3a474d39bee543fcb15e6c8e12a2755ecbfe5981":13,"9f098bffb351649542287c02d1fa61530fbc276e":0,"79e7b3f5b4a5b754da10903c2f649e4ab6ff0cbd":22,"8680a40a3c76da9fd98bb270fa8590ead01022ef":2,"83ed6361353a2e0ebad094e9302b2eeaaf03aa86":163,"5372e211e33caf08989f4bc7c0ba068456169b41":206,"aff2703ff449bfc5d86fa700424815349b9950ca":4,"4d65bb01ed5e30718ae2074b8ecb9f3812b617a6":2,"69879b4d94ecf3698b78d47ca014fec1c0fd6a54":44,"eea888ac50fae9a3c6473a99aa13fc4e999cf1cf":14},"tools":{"claude-code":{"name":"Claude Code","commits":43,"loc":5798,"first_seen":1768521824,"last_seen":1769711690},"jules":{"name":"Jules","commits":19,"loc":779,"first_seen":1790310977,"last_seen":1791071554}},"monthly":{"2026-01":{"loc":14444,"attributed_loc":5798},"2026-02":{"loc":582,"attributed_loc":0},"2026-04":{"loc":364,"attributed_loc":0},"2026-09":{"loc":4132,"attributed_loc":715},"2026-10":{"loc":64,"attributed_loc":64}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":3.0,"workflow_agents":0.0,"tools_configured":3.0,"earliest_adoption":1769553181.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":"CLAUDE.md (claude-code configuration)","ref":"CLAUDE.md","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/CLAUDE.md","weight":0.5},{"kind":"ai-artifact","description":"AGENTS.md (generic-agent configuration)","ref":"AGENTS.md","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/AGENTS.md","weight":0.5},{"kind":"ai-artifact","description":"GEMINI.md (gemini configuration)","ref":"GEMINI.md","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/GEMINI.md","weight":0.5}],"data":{"artifacts":[{"tool":"claude-code","path":"CLAUDE.md","added_at":1769553181},{"tool":"generic-agent","path":"AGENTS.md","added_at":1790269283},{"tool":"gemini","path":"GEMINI.md","added_at":1790269283}],"workflows":[],"tools":["claude-code","gemini","generic-agent"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":21.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":16275.0,"flagged_loc":5926.0,"flagged_loc_share":0.3641167434715822,"max_loc_per_hour":1472.9941291585128,"median_loc_per_hour":331.58692033006804,"pr_timed_units":0.0,"excluded_import_loc":3311.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"2,509 lines of first-party code in ~1.7h (1,473 lines/hour, 7 commit session)","ref":"64998aae5c05e3efe03a5acb019d9c977c790e01","url":"https://github.com/mambucodev/votetracker/commit/64998aae5c05e3efe03a5acb019d9c977c790e01","weight":0.44189823874755385},{"kind":"velocity-burst","description":"3,417 lines of first-party code in ~4.5h (754 lines/hour, 5 commit session)","ref":"57db3969f7f81c25583564bfb7d90f2bd8d62691","url":"https://github.com/mambucodev/votetracker/commit/57db3969f7f81c25583564bfb7d90f2bd8d62691","weight":0.22609729199852957}],"data":{"flagged_loc_by_commit":{"ff2c9adcab54d112da04bee09b597965dca971ed":629,"fbb5053262937a27f377879d4d46cdd5b4bd48de":1,"afde2d214eae523e32de9e064af626a28f0e733d":1154,"766bfa2ea23b21dee65d957af0c76f590ec978e3":26,"d82c5e6323704937b08783117f6acca83e47a66f":575,"720a4e026570f861fc701a90168a091bc70dead9":72,"64998aae5c05e3efe03a5acb019d9c977c790e01":52,"e6a128f88c9b2a793f47e801b5be6a518653ad8c":497,"85c3936f2ce6edbf79c644d3baf35958cf9f67e2":10,"fa68597ae1104519b7f7e7466b6b214333906ad7":2241,"686b094d8f63f907ec45ea4935f4c7628e7313f7":350,"57db3969f7f81c25583564bfb7d90f2bd8d62691":319},"excluded_import_commits":["6cf6cb426eaf4f524577421ba5ef8fbb23a51e13"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":12.0,"flagged_releases":0.0,"max_loc_per_day":30057.4},"findings":[],"evidence":[],"data":{"releases":[{"from":"v2.2.0","to":"v2.3.0","loc":733,"days":0.09,"loc_per_day":7754.5,"flagged":false},{"from":"v2.3.0","to":"v2.4.0","loc":1761,"days":0.06,"loc_per_day":30057.4,"flagged":false},{"from":"v2.4.0","to":"v2.4.1","loc":16,"days":0.57,"loc_per_day":27.9,"flagged":false},{"from":"v2.4.1","to":"v2.4.2","loc":66,"days":3.07,"loc_per_day":21.5,"flagged":false},{"from":"v2.4.2","to":"v2.5.0","loc":1322,"days":7.16,"loc_per_day":184.5,"flagged":false},{"from":"v2.5.0","to":"v2.6.0","loc":376,"days":1.03,"loc_per_day":363.6,"flagged":false},{"from":"v2.6.0","to":"v2.7.0","loc":2139,"days":0.85,"loc_per_day":2520.8,"flagged":false},{"from":"v2.7.0","to":"v2.7.1","loc":630,"days":0.05,"loc_per_day":11789.5,"flagged":false},{"from":"v2.7.1","to":"v2.8.0","loc":4071,"days":1.2,"loc_per_day":3387.1,"flagged":false},{"from":"v2.8.0","to":"v2.8.1","loc":19,"days":1.53,"loc_per_day":12.4,"flagged":false},{"from":"v2.8.1","to":"v2.8.2","loc":582,"days":17.24,"loc_per_day":33.8,"flagged":false},{"from":"v2.8.2","to":"v2.9.0","loc":364,"days":56.6,"loc_per_day":6.4,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":13766.0,"index":0.436,"count:narrated_steps":5.0,"per_kloc:narrated_steps":0.363,"files:narrated_steps":1.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":2.0,"per_kloc:emoji_in_code":0.145,"files:emoji_in_code":1.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: GET login page to establish session","ref":"src/votetracker/providers/axios_provider.py:92","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/providers/axios_provider.py#L92","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 2: POST login credentials","ref":"src/votetracker/providers/axios_provider.py:99","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/providers/axios_provider.py#L99","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 0: Load dashboard first (browser does this before FAMILY_VOTI)","ref":"src/votetracker/providers/axios_provider.py:196","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/providers/axios_provider.py#L196","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 1: Load the grades page (uppercase Action parameter)","ref":"src/votetracker/providers/axios_provider.py:203","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/providers/axios_provider.py#L203","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 2: Fetch grades for EACH term separately","ref":"src/votetracker/providers/axios_provider.py:241","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/providers/axios_provider.py#L241","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":1.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"src/votetracker/classeviva.py","line":37,"fingerprint":"src/votetracker/classeviva.py:generic-api-key:37"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":1.0,"findings_high":1.0,"findings_medium":0.0,"findings_low":0.0,"weighted_findings":0.75,"scanned_lines":13766.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'run' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"scripts/build.py","line":76,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:scripts/build.py:76"}],"evidence":[],"data":{"rulesets":["python","rust","bash"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":3.0,"vulnerabilities":3.0,"vulns_critical":0.0,"vulns_high":0.0,"vulns_medium":1.0,"vulns_low":0.0,"vulns_unknown":2.0,"penalty":9.0},"findings":[{"rule_id":"osv/RUSTSEC-2026-0459","severity":"medium","message":"libsqlite3-sys@0.30.1 (crates.io) is affected by RUSTSEC-2026-0459","path":"Cargo.lock","line":null,"fingerprint":"libsqlite3-sys@0.30.1 (crates.io):RUSTSEC-2026-0459"},{"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/RUSTSEC-2026-0386","severity":"medium","message":"tokio@1.53.1 (crates.io) is affected by RUSTSEC-2026-0386","path":"Cargo.lock","line":null,"fingerprint":"tokio@1.53.1 (crates.io):RUSTSEC-2026-0386"}],"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":25.0,"findings_high":14.0,"findings_medium":10.0,"findings_low":1.0,"penalty":187.2},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yml","line":18,"fingerprint":"unpinned-uses:.github/workflows/build.yml:18"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yml","line":21,"fingerprint":"unpinned-uses:.github/workflows/build.yml:21"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yml","line":35,"fingerprint":"unpinned-uses:.github/workflows/build.yml:35"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yml","line":42,"fingerprint":"unpinned-uses:.github/workflows/build.yml:42"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yml","line":49,"fingerprint":"unpinned-uses:.github/workflows/build.yml:49"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yml","line":64,"fingerprint":"unpinned-uses:.github/workflows/build.yml:64"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yml","line":77,"fingerprint":"unpinned-uses:.github/workflows/build.yml:77"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/test.yml","line":22,"fingerprint":"unpinned-uses:.github/workflows/test.yml:22"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/test.yml","line":25,"fingerprint":"unpinned-uses:.github/workflows/test.yml:25"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/test.yml","line":56,"fingerprint":"unpinned-uses:.github/workflows/test.yml:56"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/test.yml","line":59,"fingerprint":"unpinned-uses:.github/workflows/test.yml:59"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/test.yml","line":86,"fingerprint":"unpinned-uses:.github/workflows/test.yml:86"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/test.yml","line":89,"fingerprint":"unpinned-uses:.github/workflows/test.yml:89"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/test.yml","line":112,"fingerprint":"unpinned-uses:.github/workflows/test.yml:112"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/build.yml","line":18,"fingerprint":"artipacked:.github/workflows/build.yml:18"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/build.yml","line":1,"fingerprint":"excessive-permissions:.github/workflows/build.yml:1"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/build.yml","line":10,"fingerprint":"excessive-permissions:.github/workflows/build.yml:10"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/test.yml","line":21,"fingerprint":"artipacked:.github/workflows/test.yml:21"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/test.yml","line":55,"fingerprint":"artipacked:.github/workflows/test.yml:55"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/test.yml","line":85,"fingerprint":"artipacked:.github/workflows/test.yml:85"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/test.yml","line":1,"fingerprint":"excessive-permissions:.github/workflows/test.yml:1"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/test.yml","line":11,"fingerprint":"excessive-permissions:.github/workflows/test.yml:11"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/test.yml","line":50,"fingerprint":"excessive-permissions:.github/workflows/test.yml:50"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/test.yml","line":80,"fingerprint":"excessive-permissions:.github/workflows/test.yml:80"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/build.yml","line":77,"fingerprint":"superfluous-actions:.github/workflows/build.yml:77"}],"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.2222,"unpinned_manifests":2.0},"findings":[],"evidence":[{"kind":"posture","description":"crates/votetracker-core/Cargo.toml has no lockfile alongside it (unpinned dependencies)","ref":"crates/votetracker-core/Cargo.toml","url":null,"weight":0.3},{"kind":"posture","description":"crates/votetracker-gtk/Cargo.toml has no lockfile alongside it (unpinned dependencies)","ref":"crates/votetracker-gtk/Cargo.toml","url":null,"weight":0.3}],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":1.0,"binary_assets":10.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v2.9.0 ships VoteTracker-Windows.exe (3 downloads)","ref":"VoteTracker-Windows.exe","url":"https://github.com/mambucodev/votetracker/releases/download/v2.9.0/VoteTracker-Windows.exe","weight":0.0},{"kind":"binary-release-asset","description":"release v2.8.2 ships VoteTracker-Windows.exe (4 downloads)","ref":"VoteTracker-Windows.exe","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.2/VoteTracker-Windows.exe","weight":0.0},{"kind":"binary-release-asset","description":"release v2.8.1 ships VoteTracker-Windows.exe (1 downloads)","ref":"VoteTracker-Windows.exe","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.1/VoteTracker-Windows.exe","weight":0.0},{"kind":"binary-release-asset","description":"release v2.8.0 ships VoteTracker-Windows.exe (4 downloads)","ref":"VoteTracker-Windows.exe","url":"https://github.com/mambucodev/votetracker/releases/download/v2.8.0/VoteTracker-Windows.exe","weight":0.0},{"kind":"binary-release-asset","description":"release v2.7.1 ships VoteTracker-Windows.exe (1 downloads)","ref":"VoteTracker-Windows.exe","url":"https://github.com/mambucodev/votetracker/releases/download/v2.7.1/VoteTracker-Windows.exe","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":446.0,"function_nloc":7925.0,"mean_ccn":3.52,"p90_ccn":8.0,"complex_functions":14.0,"long_functions":8.0,"many_param_functions":3.0,"risky_nloc_share":0.2167},"findings":[],"evidence":[{"kind":"complex-function","description":"_import_from_provider in src/votetracker/pages/settings.py: complexity 32, 153 lines","ref":"src/votetracker/pages/settings.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/pages/settings.py#L1514","weight":0.5333333333333333},{"kind":"complex-function","description":"_import_from_classeviva in src/votetracker/pages/settings.py: complexity 27, 121 lines","ref":"src/votetracker/pages/settings.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/pages/settings.py#L1086","weight":0.45},{"kind":"complex-function","description":"get_grades in src/votetracker/providers/axios_provider.py: complexity 27, 114 lines","ref":"src/votetracker/providers/axios_provider.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/providers/axios_provider.py#L165","weight":0.45},{"kind":"complex-function","description":"login in src/votetracker/providers/axios_provider.py: complexity 20, 61 lines","ref":"src/votetracker/providers/axios_provider.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/providers/axios_provider.py#L59","weight":0.3333333333333333},{"kind":"complex-function","description":"find_best_match in src/votetracker/subject_matcher.py: complexity 20, 35 lines","ref":"src/votetracker/subject_matcher.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/subject_matcher.py#L36","weight":0.3333333333333333},{"kind":"complex-function","description":"refresh in crates/votetracker-gtk/src/pages/dashboard.rs: complexity 19, 180 lines","ref":"crates/votetracker-gtk/src/pages/dashboard.rs","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/crates/votetracker-gtk/src/pages/dashboard.rs#L30","weight":0.31666666666666665},{"kind":"complex-function","description":"refresh in crates/votetracker-gtk/src/pages/report_card.rs: complexity 19, 95 lines","ref":"crates/votetracker-gtk/src/pages/report_card.rs","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/crates/votetracker-gtk/src/pages/report_card.rs#L15","weight":0.31666666666666665},{"kind":"complex-function","description":"refresh in src/votetracker/pages/dashboard.py: complexity 19, 61 lines","ref":"src/votetracker/pages/dashboard.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/pages/dashboard.py#L227","weight":0.31666666666666665},{"kind":"complex-function","description":"refresh in src/votetracker/pages/statistics.py: complexity 19, 58 lines","ref":"src/votetracker/pages/statistics.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/pages/statistics.py#L445","weight":0.31666666666666665},{"kind":"complex-function","description":"_convert_axios_grades in src/votetracker/providers/axios_provider.py: complexity 19, 66 lines","ref":"src/votetracker/providers/axios_provider.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/providers/axios_provider.py#L345","weight":0.31666666666666665}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":10494.0,"duplicated_lines":558.0,"duplicated_share":0.0532,"files":49.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: crates/votetracker-core/src/db.rs:278 and crates/votetracker-core/src/db.rs:328","ref":"crates/votetracker-core/src/db.rs","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/crates/votetracker-core/src/db.rs#L278","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: crates/votetracker-core/src/models.rs:23 and crates/votetracker-core/src/models.rs:36","ref":"crates/votetracker-core/src/models.rs","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/crates/votetracker-core/src/models.rs#L23","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: crates/votetracker-gtk/src/pages/dashboard.rs:13 and crates/votetracker-gtk/src/pages/subjects.rs:13","ref":"crates/votetracker-gtk/src/pages/dashboard.rs","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/crates/votetracker-gtk/src/pages/dashboard.rs#L13","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: crates/votetracker-gtk/src/pages/dashboard.rs:71 and crates/votetracker-gtk/src/pages/dashboard.rs:90","ref":"crates/votetracker-gtk/src/pages/dashboard.rs","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/crates/votetracker-gtk/src/pages/dashboard.rs#L71","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: crates/votetracker-gtk/src/pages/subjects.rs:11 and crates/votetracker-gtk/src/pages/votes.rs:13","ref":"crates/votetracker-gtk/src/pages/subjects.rs","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/crates/votetracker-gtk/src/pages/subjects.rs#L11","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/votetracker/database.py:759 and src/votetracker/database.py:1192","ref":"src/votetracker/database.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/database.py#L759","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/votetracker/dialogs.py:91 and src/votetracker/dialogs.py:175","ref":"src/votetracker/dialogs.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/dialogs.py#L91","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/votetracker/pages/calendar.py:84 and src/votetracker/pages/statistics.py:313","ref":"src/votetracker/pages/calendar.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/pages/calendar.py#L84","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/votetracker/pages/calendar.py:130 and src/votetracker/pages/report_card.py:74","ref":"src/votetracker/pages/calendar.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/pages/calendar.py#L130","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/votetracker/pages/report_card.py:539 and src/votetracker/pages/votes.py:321","ref":"src/votetracker/pages/report_card.py","url":"https://github.com/mambucodev/votetracker/blob/2097876e77b7637efdd19b5ed03020c48883c213/src/votetracker/pages/report_card.py#L539","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":3.0,"weighted_findings":3.0,"scanned_lines":13766.0,"category:best-practice":2.0,"category:maintainability":1.0},"findings":[{"rule_id":"opengrep/python.lang.best-practice.logging-error-without-handling","severity":"medium","message":"Errors should only be logged when handled. The code logs the error and propogates the exception, consider reducing the level to warning or info.","path":"src/votetracker/database.py","line":244,"fingerprint":"python.lang.best-practice.logging-error-without-handling:src/votetracker/database.py:244"},{"rule_id":"opengrep/python.lang.best-practice.logging-error-without-handling","severity":"medium","message":"Errors should only be logged when handled. The code logs the error and propogates the exception, consider reducing the level to warning or info.","path":"src/votetracker/database.py","line":402,"fingerprint":"python.lang.best-practice.logging-error-without-handling:src/votetracker/database.py:402"},{"rule_id":"opengrep/python.lang.maintainability.useless-if-body","severity":"medium","message":"Useless if statement; both blocks have the same body","path":"src/votetracker/pages/settings.py","line":1671,"fingerprint":"python.lang.maintainability.useless-if-body:src/votetracker/pages/settings.py:1671"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.2545,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.1667,"test_lines":1752.0,"source_lines":13766.0,"test_ratio":0.1273,"ci_files":2.0,"cochange_share":0.0417,"cochange_commits":120.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/build.yml","ref":".github/workflows/build.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/test.yml","ref":".github/workflows/test.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (unittest)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["unittest"],"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":148.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":"ok","tool_version":null,"metrics":{"check:strict_config":0.0,"check:low_escape_density":1.0,"escapes":28.0,"escapes_per_kloc":2.531},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":4851.0,"other_lines":8915.0,"files_blamed":49.0,"blame_failures":0.0,"quality:ai_findings":2.0,"quality:ai_per_kloc":0.412,"quality:other_findings":1.0,"quality:other_per_kloc":0.112,"quality:ratio":3.68,"security:ai_findings":1.0,"security:ai_per_kloc":0.206,"security:other_findings":1.0,"security:other_per_kloc":0.112,"security:ratio":1.84},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":true},"error":null}],"flags":[]}