{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-13T23:54:06.153447Z","repo":{"ref":{"host":"github.com","owner":"leolaporte","name":"beatcheck"},"default_branch":"main","clone_url":"https://github.com/leolaporte/beatcheck.git","html_url":"https://github.com/leolaporte/beatcheck","description":"Opinionated TUI RSS reader for Linux and Mac","stars":39,"forks":5,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":169,"primary_language":"Rust","license_spdx":null,"created_at":"2026-01-11T21:41:02Z","pushed_at":"2026-06-16T14:55:00Z","security_policy_url":null,"distribution":{"owner_created_at":"2017-12-11T05:58:53Z","owner_type":"User","release_assets":[{"name":"beatcheck-linux-aarch64.tar.gz","size":3343628,"download_count":6,"release_tag":"v1.2.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.2.1/beatcheck-linux-aarch64.tar.gz"},{"name":"beatcheck-linux-x86_64.tar.gz","size":3392129,"download_count":15,"release_tag":"v1.2.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.2.1/beatcheck-linux-x86_64.tar.gz"},{"name":"beatcheck-macos-aarch64.tar.gz","size":3055182,"download_count":9,"release_tag":"v1.2.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.2.1/beatcheck-macos-aarch64.tar.gz"},{"name":"beatcheck-macos-x86_64.tar.gz","size":3163970,"download_count":10,"release_tag":"v1.2.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.2.1/beatcheck-macos-x86_64.tar.gz"},{"name":"speedy-reader-linux-aarch64.tar.gz","size":3368309,"download_count":6,"release_tag":"v1.1.2","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.2/speedy-reader-linux-aarch64.tar.gz"},{"name":"speedy-reader-linux-x86_64.tar.gz","size":3408956,"download_count":8,"release_tag":"v1.1.2","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.2/speedy-reader-linux-x86_64.tar.gz"},{"name":"speedy-reader-macos-aarch64.tar.gz","size":3068532,"download_count":8,"release_tag":"v1.1.2","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.2/speedy-reader-macos-aarch64.tar.gz"},{"name":"speedy-reader-macos-x86_64.tar.gz","size":3181167,"download_count":6,"release_tag":"v1.1.2","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.2/speedy-reader-macos-x86_64.tar.gz"},{"name":"speedy-reader-linux-aarch64.tar.gz","size":3370631,"download_count":9,"release_tag":"v1.1.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.1/speedy-reader-linux-aarch64.tar.gz"},{"name":"speedy-reader-linux-x86_64.tar.gz","size":3407339,"download_count":11,"release_tag":"v1.1.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.1/speedy-reader-linux-x86_64.tar.gz"},{"name":"speedy-reader-macos-aarch64.tar.gz","size":3067929,"download_count":9,"release_tag":"v1.1.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.1/speedy-reader-macos-aarch64.tar.gz"},{"name":"speedy-reader-macos-x86_64.tar.gz","size":3179906,"download_count":12,"release_tag":"v1.1.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.1/speedy-reader-macos-x86_64.tar.gz"},{"name":"speedy-reader-linux-aarch64.tar.gz","size":3368178,"download_count":9,"release_tag":"v1.1.0","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.0/speedy-reader-linux-aarch64.tar.gz"},{"name":"speedy-reader-linux-x86_64.tar.gz","size":3407395,"download_count":10,"release_tag":"v1.1.0","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.0/speedy-reader-linux-x86_64.tar.gz"},{"name":"speedy-reader-macos-aarch64.tar.gz","size":3068234,"download_count":9,"release_tag":"v1.1.0","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.0/speedy-reader-macos-aarch64.tar.gz"},{"name":"speedy-reader-macos-x86_64.tar.gz","size":3179412,"download_count":9,"release_tag":"v1.1.0","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.0/speedy-reader-macos-x86_64.tar.gz"},{"name":"speedy-reader-linux-aarch64.tar.gz","size":3370849,"download_count":7,"release_tag":"v1.0.6","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.6/speedy-reader-linux-aarch64.tar.gz"},{"name":"speedy-reader-linux-x86_64.tar.gz","size":3407563,"download_count":7,"release_tag":"v1.0.6","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.6/speedy-reader-linux-x86_64.tar.gz"},{"name":"speedy-reader-macos-aarch64.tar.gz","size":3068223,"download_count":7,"release_tag":"v1.0.6","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.6/speedy-reader-macos-aarch64.tar.gz"},{"name":"speedy-reader-macos-x86_64.tar.gz","size":3179811,"download_count":7,"release_tag":"v1.0.6","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.6/speedy-reader-macos-x86_64.tar.gz"},{"name":"speedy-reader-linux-aarch64.tar.gz","size":3368122,"download_count":9,"release_tag":"v1.0.5","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.5/speedy-reader-linux-aarch64.tar.gz"},{"name":"speedy-reader-linux-x86_64.tar.gz","size":3408358,"download_count":11,"release_tag":"v1.0.5","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.5/speedy-reader-linux-x86_64.tar.gz"},{"name":"speedy-reader-macos-aarch64.tar.gz","size":3068058,"download_count":9,"release_tag":"v1.0.5","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.5/speedy-reader-macos-aarch64.tar.gz"},{"name":"speedy-reader-macos-x86_64.tar.gz","size":3181040,"download_count":9,"release_tag":"v1.0.5","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.5/speedy-reader-macos-x86_64.tar.gz"},{"name":"speedy-reader-linux-aarch64.tar.gz","size":3371212,"download_count":7,"release_tag":"v1.0.4","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.4/speedy-reader-linux-aarch64.tar.gz"},{"name":"speedy-reader-linux-x86_64.tar.gz","size":3407822,"download_count":7,"release_tag":"v1.0.4","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.4/speedy-reader-linux-x86_64.tar.gz"},{"name":"speedy-reader-macos-aarch64.tar.gz","size":3067969,"download_count":7,"release_tag":"v1.0.4","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.4/speedy-reader-macos-aarch64.tar.gz"},{"name":"speedy-reader-macos-x86_64.tar.gz","size":3180546,"download_count":7,"release_tag":"v1.0.4","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.4/speedy-reader-macos-x86_64.tar.gz"},{"name":"speedy-reader-linux-aarch64.tar.gz","size":3371240,"download_count":8,"release_tag":"v1.0.3","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.3/speedy-reader-linux-aarch64.tar.gz"},{"name":"speedy-reader-linux-x86_64.tar.gz","size":3407852,"download_count":9,"release_tag":"v1.0.3","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.3/speedy-reader-linux-x86_64.tar.gz"},{"name":"speedy-reader-macos-aarch64.tar.gz","size":3067991,"download_count":8,"release_tag":"v1.0.3","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.3/speedy-reader-macos-aarch64.tar.gz"},{"name":"speedy-reader-macos-x86_64.tar.gz","size":3180525,"download_count":9,"release_tag":"v1.0.3","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.3/speedy-reader-macos-x86_64.tar.gz"},{"name":"speedy-reader-linux-aarch64.tar.gz","size":3372279,"download_count":5,"release_tag":"v1.0.2","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.2/speedy-reader-linux-aarch64.tar.gz"},{"name":"speedy-reader-linux-x86_64.tar.gz","size":3410846,"download_count":5,"release_tag":"v1.0.2","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.2/speedy-reader-linux-x86_64.tar.gz"},{"name":"speedy-reader-macos-aarch64.tar.gz","size":3069094,"download_count":5,"release_tag":"v1.0.2","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.2/speedy-reader-macos-aarch64.tar.gz"},{"name":"speedy-reader-macos-x86_64.tar.gz","size":3183302,"download_count":5,"release_tag":"v1.0.2","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.2/speedy-reader-macos-x86_64.tar.gz"},{"name":"speedy-reader-linux-aarch64.tar.gz","size":3373188,"download_count":6,"release_tag":"v1.0.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.1/speedy-reader-linux-aarch64.tar.gz"},{"name":"speedy-reader-linux-x86_64.tar.gz","size":3412446,"download_count":7,"release_tag":"v1.0.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.1/speedy-reader-linux-x86_64.tar.gz"},{"name":"speedy-reader-macos-aarch64.tar.gz","size":3068811,"download_count":6,"release_tag":"v1.0.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.1/speedy-reader-macos-aarch64.tar.gz"},{"name":"speedy-reader-macos-x86_64.tar.gz","size":3182579,"download_count":6,"release_tag":"v1.0.1","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.0.1/speedy-reader-macos-x86_64.tar.gz"}]}},"commit_sha":"df63006cb02de130716378042f8a1f492ac936ce","profile":{"lines_by_language":{"Rust":4944,"Shell":51},"files_by_category":{"source":26,"docs":6,"other":4,"config":4,"generated":1},"source_lines":4995,"test_lines":0},"pillars":{"ai_provenance":{"score":86.5,"confidence":0.92,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.8654,"suspected_share":0.0,"estimated_share":0.8654,"ai_artifacts":2.0,"flagged_work_units":0.0,"flagged_releases":0.0},"summary":"Explicit AI attribution on 87% of first-party code added; an estimated 87% including velocity signals."},"quality":{"score":61.7,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":65.4,"duplication":61.0,"lint":100.0,"testing":45.0,"docs":40.0,"type_safety":null,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.00, CI runs tests; 14% of function code in complex or long functions; 8% duplicated lines. Weakest area: docs."},"security":{"score":60.5,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":100.0,"sast":94.9,"dependencies":38.0,"ci_actions":19.4,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 27 known vulnerabilities in 16 dependencies; 8 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":26.0,"checked":26.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":90.0,"attributed_commits":75.0,"attributed_commit_share":0.8333333333333334,"effective_loc":5982.0,"attributed_loc":5177.0,"attributed_loc_share":0.8654296221999331,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 75 attributed commits, 5,177 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"df63006cb02de130716378042f8a1f492ac936ce","url":"https://github.com/leolaporte/beatcheck/commit/df63006cb02de130716378042f8a1f492ac936ce","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"71a2af85a59a6b214bcd743e1da4ae35b9003fe1","url":"https://github.com/leolaporte/beatcheck/commit/71a2af85a59a6b214bcd743e1da4ae35b9003fe1","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"d2938abd50a1cea54e8ca18ff6fb40168f5c2f4f","url":"https://github.com/leolaporte/beatcheck/commit/d2938abd50a1cea54e8ca18ff6fb40168f5c2f4f","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"9aefb91a57c54e94084f7ecfa4f7a57165741650","url":"https://github.com/leolaporte/beatcheck/commit/9aefb91a57c54e94084f7ecfa4f7a57165741650","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"8346ac4d16291cba9991f637a125b05a455bcd36","url":"https://github.com/leolaporte/beatcheck/commit/8346ac4d16291cba9991f637a125b05a455bcd36","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"8b70a960b65325ca15b45dc1fd8a6368fe782981","url":"https://github.com/leolaporte/beatcheck/commit/8b70a960b65325ca15b45dc1fd8a6368fe782981","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"65d4260b27e7779f2735314b256b81d51ef35fd8","url":"https://github.com/leolaporte/beatcheck/commit/65d4260b27e7779f2735314b256b81d51ef35fd8","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"6b7616815ea1da1adc389dfade952abc044278e1","url":"https://github.com/leolaporte/beatcheck/commit/6b7616815ea1da1adc389dfade952abc044278e1","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"dd711e7c7e9785914c7c06cc7577737d95b7b51b","url":"https://github.com/leolaporte/beatcheck/commit/dd711e7c7e9785914c7c06cc7577737d95b7b51b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"510b2ac21c8c2a62b56ada20ffb9a3636c53d4ee","url":"https://github.com/leolaporte/beatcheck/commit/510b2ac21c8c2a62b56ada20ffb9a3636c53d4ee","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"35caa4c544ca528ef836a598f9c82aeaa19e1ea7","url":"https://github.com/leolaporte/beatcheck/commit/35caa4c544ca528ef836a598f9c82aeaa19e1ea7","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"a47d534b1c021365821e972e6cb99f0a16d14573","url":"https://github.com/leolaporte/beatcheck/commit/a47d534b1c021365821e972e6cb99f0a16d14573","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"84335ad89fe8135e81497ca5ff23c1735240f2c1","url":"https://github.com/leolaporte/beatcheck/commit/84335ad89fe8135e81497ca5ff23c1735240f2c1","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"4efa951a8f16cb82802ef9ff2724324a8d31cf96","url":"https://github.com/leolaporte/beatcheck/commit/4efa951a8f16cb82802ef9ff2724324a8d31cf96","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"fb35a995755f5aa732395e2db31cb415760f9c8d","url":"https://github.com/leolaporte/beatcheck/commit/fb35a995755f5aa732395e2db31cb415760f9c8d","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"77376cdae6ac5f930a1b49ec0525d284283bb776","url":"https://github.com/leolaporte/beatcheck/commit/77376cdae6ac5f930a1b49ec0525d284283bb776","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"32c04739d95a2c1d94ca9f9eec216aabecf2521e","url":"https://github.com/leolaporte/beatcheck/commit/32c04739d95a2c1d94ca9f9eec216aabecf2521e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"03d49ecef3776567f3a7a661b8221de79d2627ac","url":"https://github.com/leolaporte/beatcheck/commit/03d49ecef3776567f3a7a661b8221de79d2627ac","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"fc17ed4b3485993786a703050e7a5f4d7b198109","url":"https://github.com/leolaporte/beatcheck/commit/fc17ed4b3485993786a703050e7a5f4d7b198109","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"421b1c27518e089a07a5e09ec35021d98143a409","url":"https://github.com/leolaporte/beatcheck/commit/421b1c27518e089a07a5e09ec35021d98143a409","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"4c0dfe04ce4d2544d1a9b5bdf5d7326e3bce6c35","url":"https://github.com/leolaporte/beatcheck/commit/4c0dfe04ce4d2544d1a9b5bdf5d7326e3bce6c35","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"9d17a7441aa09d8c335d2322dfada75e02bafd9b","url":"https://github.com/leolaporte/beatcheck/commit/9d17a7441aa09d8c335d2322dfada75e02bafd9b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"2bf7f2fbc6ad9569ad3836e3723026d98fa599b3","url":"https://github.com/leolaporte/beatcheck/commit/2bf7f2fbc6ad9569ad3836e3723026d98fa599b3","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"4ced370e3cae57bd812551638dd4c34463dac720","url":"https://github.com/leolaporte/beatcheck/commit/4ced370e3cae57bd812551638dd4c34463dac720","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"746af2c640a769ef1fe50b755921dc0c29be8abd","url":"https://github.com/leolaporte/beatcheck/commit/746af2c640a769ef1fe50b755921dc0c29be8abd","weight":0.9}],"data":{"attributed_loc_by_commit":{"9f0e9f3bd4b0e711a65b67fa8ae6fe44f1d32ef5":1900,"72c9fd14f0e7d6cbcab76b95e7e577e16af11d0e":0,"f2da524eefc78f669a037078d05bef920fa954f7":4,"fdf2315d1869f56d95bff84ea759a6e6514290eb":0,"019b4fe246ea86b833264749982f0eafa263966d":0,"2120f2d24cce6b4f00024c9e7a24b286c6b8beb5":0,"27f557d03740a3eb8a648b67ee8c5bf1fef8de3e":2,"c8e6fe81a5f1815102e74d059cf302afd618a852":36,"0a8dff96934bead529148ba2b3f2648add5fbc1f":0,"697c2ce4d7998695eb1959476e6bfc5cf18f9cd9":4,"32cb7541dae258f60886bef9926551bc592c96fd":3,"5b44d0c0c5d042d18bc1f7429f896920592d518f":73,"fdd5871469edb32605f644ecf95de9142dcc233f":1,"116918af9756425fbfe1e0eafcc424d0a2787170":321,"5f31529e3581176e2c466103be87434a06b9f6d3":20,"98d256a00d6fae4d0e6d147f890ca128c27094c8":52,"b9f42fcd7ef0580b03268ee848e88e49ddbcca5e":68,"21f36fe796daeb1416c144cd731b9ac04feaf353":380,"fa05447556bf1c78ca8e60e0972cccb8f0c953a3":0,"850fcb6850cf97db4887dc2617feff84a97604b7":3,"2ee153f72382bcd53e2d3ff80c8d79c3f91229ae":0,"8463e9f5f0d01b6c1b0296778948c7480ba0b74d":135,"a5eb2bccaf60c1c0fb09b8144f59cc3bda501691":41,"2033b7872aea467b5d7b19b3537c17861c2a64ac":160,"d765654ba87f249d0a9d8bfdc39237ed309f0ad0":0,"db620db8d3bb44add60ce40c5a714879ef4c1a2c":0,"756cbc56de05aa849c7128bc825845fe60a12926":31,"9d1a90344327e3170bfbc350d63bd8bac9568913":16,"e41048cd28ddb7867dc36f9bf62fc31a4044117c":45,"8a338d6a1cdcdeddc124fae9683070714854cba3":0,"1495d668cba5222cd50357ba694a92471c26de62":1,"ae24a72194dbeb916979210b071db9aa7cfc48b3":2,"b9388405fe26576c8914ff5dc646ecde6b9766a0":125,"be8c82c2be3957766f45b7e3d2d14bc85244a5cb":0,"af902b72f29c7c009c562f1536aa766dc060534c":0,"ac27c4e4bcddd0e9c0194f3a3c4d3affcf6bb669":53,"da22fb1350cac1a3fcbae0c9019a92ac534a9f2d":46,"48c01c8617a2fd790b16a909e300012388baaf2f":31,"5f914a724b9897188bd90fdc23d8db59b47e5fa6":6,"424b8efb9de5601be73042774a8a10d31c008542":18,"2f58ca94e9d3719dcfc42ea24b986b389fbeeb24":7,"cbe8ba545464c582bb154a6cd60cc9ff262384e9":8,"d3a8ff98e7eccb7ec819f6e59fb038ce17dcf9ec":2,"087aca12402c51df4362b526b8d9df55c1e7dcac":7,"65c28ed963a4e9b68c7b78a43e564e1869a97aa4":20,"f383ded5dd5f3838ec4836798e7dba458ba16f62":0,"bd6976a9a5cc719c47b7db8f55b7c1ab5320e547":0,"0daa6a71bf81a562b17e09d57cf3ce491b7117a3":2,"74b5ef1d59745f5a3a7e1754bb5c58738d04508d":5,"2aa7b4a3113ac593f3340d50775e8a487f9a6638":134,"746af2c640a769ef1fe50b755921dc0c29be8abd":10,"4ced370e3cae57bd812551638dd4c34463dac720":0,"2bf7f2fbc6ad9569ad3836e3723026d98fa599b3":0,"9d17a7441aa09d8c335d2322dfada75e02bafd9b":0,"4c0dfe04ce4d2544d1a9b5bdf5d7326e3bce6c35":2,"421b1c27518e089a07a5e09ec35021d98143a409":245,"fc17ed4b3485993786a703050e7a5f4d7b198109":206,"03d49ecef3776567f3a7a661b8221de79d2627ac":225,"32c04739d95a2c1d94ca9f9eec216aabecf2521e":0,"77376cdae6ac5f930a1b49ec0525d284283bb776":141,"fb35a995755f5aa732395e2db31cb415760f9c8d":0,"4efa951a8f16cb82802ef9ff2724324a8d31cf96":21,"84335ad89fe8135e81497ca5ff23c1735240f2c1":0,"a47d534b1c021365821e972e6cb99f0a16d14573":0,"35caa4c544ca528ef836a598f9c82aeaa19e1ea7":31,"510b2ac21c8c2a62b56ada20ffb9a3636c53d4ee":20,"dd711e7c7e9785914c7c06cc7577737d95b7b51b":6,"6b7616815ea1da1adc389dfade952abc044278e1":1,"65d4260b27e7779f2735314b256b81d51ef35fd8":14,"8b70a960b65325ca15b45dc1fd8a6368fe782981":0,"8346ac4d16291cba9991f637a125b05a455bcd36":42,"9aefb91a57c54e94084f7ecfa4f7a57165741650":46,"d2938abd50a1cea54e8ca18ff6fb40168f5c2f4f":0,"71a2af85a59a6b214bcd743e1da4ae35b9003fe1":397,"df63006cb02de130716378042f8a1f492ac936ce":8},"tools":{"claude-code":{"name":"Claude Code","commits":75,"loc":5177,"first_seen":1768167404,"last_seen":1781621684}},"monthly":{"2026-01":{"loc":3974,"attributed_loc":3772},"2026-02":{"loc":1494,"attributed_loc":912},"2026-03":{"loc":21,"attributed_loc":0},"2026-04":{"loc":88,"attributed_loc":88},"2026-06":{"loc":405,"attributed_loc":405}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":2.0,"workflow_agents":0.0,"tools_configured":2.0,"earliest_adoption":1768370979.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":"CLAUDE.md (claude-code configuration)","ref":"CLAUDE.md","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/CLAUDE.md","weight":0.5},{"kind":"ai-artifact","description":"AGENTS.md (generic-agent configuration)","ref":"AGENTS.md","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/AGENTS.md","weight":0.5}],"data":{"artifacts":[{"tool":"claude-code","path":"CLAUDE.md","added_at":1768370979},{"tool":"generic-agent","path":"AGENTS.md","added_at":1774067938}],"workflows":[],"tools":["claude-code","generic-agent"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":30.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":5982.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":475.0,"median_loc_per_hour":97.84372410936206,"pr_timed_units":0.0,"excluded_import_loc":0.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":[]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":25.0,"flagged_releases":0.0,"max_loc_per_day":9427.6},"findings":[],"evidence":[],"data":{"releases":[{"from":"v0.1.0","to":"v0.1.1","loc":4,"days":0.21,"loc_per_day":19.1,"flagged":false},{"from":"v0.1.1","to":"v0.1.2","loc":0,"days":0.04,"loc_per_day":0.0,"flagged":false},{"from":"v0.1.2","to":"v0.1.3","loc":0,"days":0.04,"loc_per_day":0.0,"flagged":false},{"from":"v0.1.3","to":"v0.1.4","loc":0,"days":0.04,"loc_per_day":0.0,"flagged":false},{"from":"v0.1.4","to":"v0.1.5","loc":2,"days":0.04,"loc_per_day":48.0,"flagged":false},{"from":"v0.1.5","to":"v0.1.6","loc":36,"days":0.04,"loc_per_day":864.0,"flagged":false},{"from":"v0.1.6","to":"v0.1.7","loc":0,"days":0.04,"loc_per_day":0.0,"flagged":false},{"from":"v0.1.7","to":"v0.1.8","loc":4,"days":0.04,"loc_per_day":96.0,"flagged":false},{"from":"v0.1.8","to":"v0.1.9","loc":3,"days":0.04,"loc_per_day":72.0,"flagged":false},{"from":"v0.1.9","to":"v0.2.0","loc":73,"days":0.04,"loc_per_day":1752.0,"flagged":false},{"from":"v0.2.0","to":"v0.2.1","loc":1,"days":0.04,"loc_per_day":24.0,"flagged":false},{"from":"v0.2.1","to":"v0.2.2","loc":393,"days":1.86,"loc_per_day":211.1,"flagged":false},{"from":"v0.2.2","to":"v0.2.3","loc":68,"days":0.06,"loc_per_day":1165.5,"flagged":false},{"from":"v0.2.3","to":"v1.0.0","loc":380,"days":0.13,"loc_per_day":2868.7,"flagged":false},{"from":"v1.0.0","to":"v1.0.1","loc":559,"days":0.06,"loc_per_day":9427.6,"flagged":false},{"from":"v1.0.1","to":"v1.0.2","loc":99,"days":0.43,"loc_per_day":232.7,"flagged":false},{"from":"v1.0.2","to":"v1.0.3","loc":31,"days":0.1,"loc_per_day":301.4,"flagged":false},{"from":"v1.0.3","to":"v1.0.4","loc":6,"days":0.36,"loc_per_day":16.6,"flagged":false},{"from":"v1.0.4","to":"v1.0.5","loc":18,"days":0.7,"loc_per_day":25.7,"flagged":false},{"from":"v1.0.5","to":"v1.0.6","loc":7,"days":0.09,"loc_per_day":74.0,"flagged":false},{"from":"v1.0.6","to":"v1.1.0","loc":8,"days":0.04,"loc_per_day":192.0,"flagged":false},{"from":"v1.1.0","to":"v1.1.1","loc":2,"days":0.04,"loc_per_day":48.0,"flagged":false},{"from":"v1.1.1","to":"v1.1.2","loc":7,"days":0.04,"loc_per_day":168.0,"flagged":false},{"from":"v1.1.2","to":"v1.2.0","loc":373,"days":15.03,"loc_per_day":24.8,"flagged":false},{"from":"v1.2.0","to":"v1.2.1","loc":0,"days":0.04,"loc_per_day":0.0,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":4995.0,"index":0.3,"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":3.0,"per_kloc:emoji_in_code":0.601,"files:emoji_in_code":2.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":3.0,"findings_high":0.0,"findings_medium":0.0,"findings_low":3.0,"weighted_findings":0.75,"scanned_lines":4995.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/rust.lang.security.temp-dir","severity":"low","message":"temp_dir should not be used for security operations. From the docs: 'The temporary directory may be shared among users, or between processes with different privileges; thus, the creation of any files or directories in the temporary directory must use a secure method to create a uniquely named file.  [confidence high]","path":"src/config.rs","line":307,"fingerprint":"rust.lang.security.temp-dir:src/config.rs:307"},{"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":98,"fingerprint":"rust.lang.security.args:src/main.rs:98"},{"rule_id":"opengrep/rust.lang.security.temp-dir","severity":"low","message":"temp_dir should not be used for security operations. From the docs: 'The temporary directory may be shared among users, or between processes with different privileges; thus, the creation of any files or directories in the temporary directory must use a secure method to create a uniquely named file.  [confidence high]","path":"src/services/content_fetcher.rs","line":320,"fingerprint":"rust.lang.security.temp-dir:src/services/content_fetcher.rs:320"}],"evidence":[],"data":{"rulesets":["rust","bash"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":16.0,"vulnerabilities":27.0,"vulns_critical":0.0,"vulns_high":4.0,"vulns_medium":3.0,"vulns_low":3.0,"vulns_unknown":17.0,"penalty":58.0},"findings":[{"rule_id":"osv/RUSTSEC-2026-0194","severity":"high","message":"quick-xml@0.37.5 (crates.io) is affected by RUSTSEC-2026-0194","path":"Cargo.lock","line":null,"fingerprint":"quick-xml@0.37.5 (crates.io):RUSTSEC-2026-0194"},{"rule_id":"osv/RUSTSEC-2026-0195","severity":"high","message":"quick-xml@0.37.5 (crates.io) is affected by RUSTSEC-2026-0195","path":"Cargo.lock","line":null,"fingerprint":"quick-xml@0.37.5 (crates.io):RUSTSEC-2026-0195"},{"rule_id":"osv/GHSA-4w2j-m93h-cj5j","severity":"high","message":"quinn-proto@0.11.14 (crates.io) is affected by RUSTSEC-2026-0185, GHSA-4w2j-m93h-cj5j","path":"Cargo.lock","line":null,"fingerprint":"quinn-proto@0.11.14 (crates.io):GHSA-4w2j-m93h-cj5j"},{"rule_id":"osv/RUSTSEC-2026-0340","severity":"high","message":"quinn-proto@0.11.14 (crates.io) is affected by RUSTSEC-2026-0340","path":"Cargo.lock","line":null,"fingerprint":"quinn-proto@0.11.14 (crates.io):RUSTSEC-2026-0340"},{"rule_id":"osv/RUSTSEC-2026-0190","severity":"medium","message":"anyhow@1.0.100 (crates.io) is affected by RUSTSEC-2026-0190","path":"Cargo.lock","line":null,"fingerprint":"anyhow@1.0.100 (crates.io):RUSTSEC-2026-0190"},{"rule_id":"osv/RUSTSEC-2026-0258","severity":"medium","message":"h2@0.4.13 (crates.io) is affected by RUSTSEC-2026-0258","path":"Cargo.lock","line":null,"fingerprint":"h2@0.4.13 (crates.io):RUSTSEC-2026-0258"},{"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-0253","severity":"medium","message":"lru@0.12.5 (crates.io) is affected by RUSTSEC-2026-0253","path":"Cargo.lock","line":null,"fingerprint":"lru@0.12.5 (crates.io):RUSTSEC-2026-0253"},{"rule_id":"osv/RUSTSEC-2024-0436","severity":"medium","message":"paste@1.0.15 (crates.io) is affected by RUSTSEC-2024-0436","path":"Cargo.lock","line":null,"fingerprint":"paste@1.0.15 (crates.io):RUSTSEC-2024-0436"},{"rule_id":"osv/RUSTSEC-2026-0441","severity":"medium","message":"pin-utils@0.1.0 (crates.io) is affected by RUSTSEC-2026-0441","path":"Cargo.lock","line":null,"fingerprint":"pin-utils@0.1.0 (crates.io):RUSTSEC-2026-0441"},{"rule_id":"osv/RUSTSEC-2026-0338","severity":"medium","message":"quinn-proto@0.11.14 (crates.io) is affected by RUSTSEC-2026-0338","path":"Cargo.lock","line":null,"fingerprint":"quinn-proto@0.11.14 (crates.io):RUSTSEC-2026-0338"},{"rule_id":"osv/RUSTSEC-2026-0339","severity":"medium","message":"quinn-proto@0.11.14 (crates.io) is affected by RUSTSEC-2026-0339","path":"Cargo.lock","line":null,"fingerprint":"quinn-proto@0.11.14 (crates.io):RUSTSEC-2026-0339"},{"rule_id":"osv/RUSTSEC-2026-0342","severity":"medium","message":"quinn-proto@0.11.14 (crates.io) is affected by RUSTSEC-2026-0342","path":"Cargo.lock","line":null,"fingerprint":"quinn-proto@0.11.14 (crates.io):RUSTSEC-2026-0342"},{"rule_id":"osv/RUSTSEC-2026-0523","severity":"medium","message":"quinn-proto@0.11.14 (crates.io) is affected by RUSTSEC-2026-0523","path":"Cargo.lock","line":null,"fingerprint":"quinn-proto@0.11.14 (crates.io):RUSTSEC-2026-0523"},{"rule_id":"osv/RUSTSEC-2026-0524","severity":"medium","message":"quinn-proto@0.11.14 (crates.io) is affected by RUSTSEC-2026-0524","path":"Cargo.lock","line":null,"fingerprint":"quinn-proto@0.11.14 (crates.io):RUSTSEC-2026-0524"},{"rule_id":"osv/RUSTSEC-2026-0538","severity":"medium","message":"quinn-udp@0.5.14 (crates.io) is affected by RUSTSEC-2026-0538","path":"Cargo.lock","line":null,"fingerprint":"quinn-udp@0.5.14 (crates.io):RUSTSEC-2026-0538"},{"rule_id":"osv/GHSA-cq8v-f236-94qc","severity":"medium","message":"rand@0.8.5 (crates.io) is affected by RUSTSEC-2026-0097, GHSA-cq8v-f236-94qc","path":"Cargo.lock","line":null,"fingerprint":"rand@0.8.5 (crates.io):GHSA-cq8v-f236-94qc"},{"rule_id":"osv/GHSA-cq8v-f236-94qc","severity":"medium","message":"rand@0.9.2 (crates.io) is affected by RUSTSEC-2026-0097, GHSA-cq8v-f236-94qc","path":"Cargo.lock","line":null,"fingerprint":"rand@0.9.2 (crates.io):GHSA-cq8v-f236-94qc"},{"rule_id":"osv/RUSTSEC-2026-0486","severity":"medium","message":"rustix@1.1.3 (crates.io) is affected by RUSTSEC-2026-0486","path":"Cargo.lock","line":null,"fingerprint":"rustix@1.1.3 (crates.io):RUSTSEC-2026-0486"},{"rule_id":"osv/GHSA-2mjx-qc3c-rqvc","severity":"medium","message":"rustls@0.23.36 (crates.io) is affected by RUSTSEC-2026-0285, GHSA-2mjx-qc3c-rqvc","path":"Cargo.lock","line":null,"fingerprint":"rustls@0.23.36 (crates.io):GHSA-2mjx-qc3c-rqvc"},{"rule_id":"osv/GHSA-c8m5-c952-6cm4","severity":"medium","message":"rustls@0.23.36 (crates.io) is affected by RUSTSEC-2026-0346, GHSA-c8m5-c952-6cm4","path":"Cargo.lock","line":null,"fingerprint":"rustls@0.23.36 (crates.io):GHSA-c8m5-c952-6cm4"},{"rule_id":"osv/RUSTSEC-2026-0382","severity":"medium","message":"rustls-webpki@0.103.13 (crates.io) is affected by RUSTSEC-2026-0382","path":"Cargo.lock","line":null,"fingerprint":"rustls-webpki@0.103.13 (crates.io):RUSTSEC-2026-0382"},{"rule_id":"osv/RUSTSEC-2026-0386","severity":"medium","message":"tokio@1.49.0 (crates.io) is affected by RUSTSEC-2026-0386","path":"Cargo.lock","line":null,"fingerprint":"tokio@1.49.0 (crates.io):RUSTSEC-2026-0386"},{"rule_id":"osv/RUSTSEC-2026-0381","severity":"medium","message":"webpki-roots@1.0.5 (crates.io) is affected by RUSTSEC-2026-0381","path":"Cargo.lock","line":null,"fingerprint":"webpki-roots@1.0.5 (crates.io):RUSTSEC-2026-0381"},{"rule_id":"osv/GHSA-rhfx-m35p-ff5j","severity":"low","message":"lru@0.12.5 (crates.io) is affected by RUSTSEC-2026-0002, GHSA-rhfx-m35p-ff5j","path":"Cargo.lock","line":null,"fingerprint":"lru@0.12.5 (crates.io):GHSA-rhfx-m35p-ff5j"},{"rule_id":"osv/GHSA-h2v8-394m-p7vv","severity":"low","message":"rustls@0.23.36 (crates.io) is affected by RUSTSEC-2026-0348, GHSA-h2v8-394m-p7vv","path":"Cargo.lock","line":null,"fingerprint":"rustls@0.23.36 (crates.io):GHSA-h2v8-394m-p7vv"},{"rule_id":"osv/GHSA-w44r-93j7-qv28","severity":"low","message":"rustls@0.23.36 (crates.io) is affected by RUSTSEC-2026-0349, GHSA-w44r-93j7-qv28","path":"Cargo.lock","line":null,"fingerprint":"rustls@0.23.36 (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":11.0,"findings_high":8.0,"findings_medium":2.0,"findings_low":1.0,"penalty":98.4},"findings":[{"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":20,"fingerprint":"unpinned-uses:.github/workflows/ci.yml:20"},{"rule_id":"zizmor/excessive-permissions","severity":"high","message":"overly broad permissions [confidence high]","path":".github/workflows/release.yml","line":10,"fingerprint":"excessive-permissions:.github/workflows/release.yml:10"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":36,"fingerprint":"unpinned-uses:.github/workflows/release.yml:36"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":39,"fingerprint":"unpinned-uses:.github/workflows/release.yml:39"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":63,"fingerprint":"unpinned-uses:.github/workflows/release.yml:63"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":75,"fingerprint":"unpinned-uses:.github/workflows/release.yml:75"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yml","line":80,"fingerprint":"unpinned-uses:.github/workflows/release.yml:80"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/ci.yml","line":17,"fingerprint":"artipacked:.github/workflows/ci.yml:17"},{"rule_id":"zizmor/artipacked","severity":"medium","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/release.yml","line":36,"fingerprint":"artipacked:.github/workflows/release.yml:36"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/release.yml","line":80,"fingerprint":"superfluous-actions:.github/workflows/release.yml:80"}],"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":40.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v1.2.1 ships beatcheck-linux-aarch64.tar.gz (6 downloads)","ref":"beatcheck-linux-aarch64.tar.gz","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.2.1/beatcheck-linux-aarch64.tar.gz","weight":0.0},{"kind":"binary-release-asset","description":"release v1.2.1 ships beatcheck-linux-x86_64.tar.gz (15 downloads)","ref":"beatcheck-linux-x86_64.tar.gz","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.2.1/beatcheck-linux-x86_64.tar.gz","weight":0.0},{"kind":"binary-release-asset","description":"release v1.2.1 ships beatcheck-macos-aarch64.tar.gz (9 downloads)","ref":"beatcheck-macos-aarch64.tar.gz","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.2.1/beatcheck-macos-aarch64.tar.gz","weight":0.0},{"kind":"binary-release-asset","description":"release v1.2.1 ships beatcheck-macos-x86_64.tar.gz (10 downloads)","ref":"beatcheck-macos-x86_64.tar.gz","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.2.1/beatcheck-macos-x86_64.tar.gz","weight":0.0},{"kind":"binary-release-asset","description":"release v1.1.2 ships speedy-reader-linux-aarch64.tar.gz (6 downloads)","ref":"speedy-reader-linux-aarch64.tar.gz","url":"https://github.com/leolaporte/beatcheck/releases/download/v1.1.2/speedy-reader-linux-aarch64.tar.gz","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":189.0,"function_nloc":3383.0,"mean_ccn":3.72,"p90_ccn":7.0,"complex_functions":5.0,"long_functions":1.0,"many_param_functions":0.0,"risky_nloc_share":0.1416},"findings":[],"evidence":[{"kind":"complex-function","description":"handle_action in src/app.rs: complexity 75, 200 lines","ref":"src/app.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/app.rs#L164","weight":1.0},{"kind":"complex-function","description":"handle_key_event in src/tui/handler.rs: complexity 47, 83 lines","ref":"src/tui/handler.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/tui/handler.rs#L50","weight":0.7833333333333333},{"kind":"complex-function","description":"main in src/main.rs: complexity 21, 73 lines","ref":"src/main.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/main.rs#L30","weight":0.35},{"kind":"complex-function","description":"find_firefox_cookies in src/services/content_fetcher.rs: complexity 20, 56 lines","ref":"src/services/content_fetcher.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/services/content_fetcher.rs#L212","weight":0.3333333333333333},{"kind":"complex-function","description":"discover_feed in src/feed/fetcher.rs: complexity 17, 67 lines","ref":"src/feed/fetcher.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/feed/fetcher.rs#L118","weight":0.2833333333333333}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":3474.0,"duplicated_lines":286.0,"duplicated_share":0.0823,"files":26.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: src/app.rs:273 and src/app.rs:293","ref":"src/app.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/app.rs#L273","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/db/repository.rs:193 and src/db/repository.rs:227","ref":"src/db/repository.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/db/repository.rs#L193","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/feed/fetcher.rs:23 and src/services/content_fetcher.rs:20","ref":"src/feed/fetcher.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/feed/fetcher.rs#L23","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/feed/fetcher.rs:144 and src/feed/fetcher.rs:178","ref":"src/feed/fetcher.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/feed/fetcher.rs#L144","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/models/article.rs:7 and src/models/article.rs:21","ref":"src/models/article.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/models/article.rs#L7","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/services/content_fetcher.rs:153 and src/services/content_fetcher.rs:195","ref":"src/services/content_fetcher.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/services/content_fetcher.rs#L153","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/tui/ui.rs:278 and src/tui/ui.rs:343","ref":"src/tui/ui.rs","url":"https://github.com/leolaporte/beatcheck/blob/df63006cb02de130716378042f8a1f492ac936ce/src/tui/ui.rs#L278","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":4995.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":1.0,"check:tests_cochange":0.0,"test_lines":0.0,"source_lines":4995.0,"test_ratio":0.0,"ci_files":2.0,"cochange_share":0.0,"cochange_commits":65.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},{"kind":"ci","description":"CI runs linters (clippy, rustfmt, cargo fmt)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["go test","cargo test"],"lint_commands":["clippy","rustfmt","cargo fmt"]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":0.0,"check:contributing":0.0,"check:changelog":0.0,"readme_lines":113.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":4231.0,"other_lines":764.0,"files_blamed":26.0,"blame_failures":0.0,"quality:ai_findings":0.0,"quality:ai_per_kloc":0.0,"quality:other_findings":0.0,"quality:other_per_kloc":0.0,"security:ai_findings":3.0,"security:ai_per_kloc":0.709,"security:other_findings":0.0,"security:other_per_kloc":0.0},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":true},"error":null}],"flags":["unreviewed-ai-risk"]}