{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-14T00:00:09.338302Z","repo":{"ref":{"host":"github.com","owner":"AgriciDaniel","name":"claude-blog"},"default_branch":"main","clone_url":"https://github.com/AgriciDaniel/claude-blog.git","html_url":"https://github.com/AgriciDaniel/claude-blog","description":"Free, open source blog writer for Claude Code. Researches current sources, writes answer-first posts for Google and AI answers, has an independent reviewer score each one out of 100 and ships only after five delivery gates. 32 skills, 30 /blog commands, 5 agents. Active development at AI-Marketing-Hub/claude-blog; public releases ship here.","stars":2747,"forks":472,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":7252,"primary_language":"Python","license_spdx":"MIT","created_at":"2026-02-17T22:40:44Z","pushed_at":"2026-11-03T00:20:12Z","security_policy_url":"https://github.com/AgriciDaniel/claude-blog/security/policy","distribution":{"owner_created_at":"2025-07-27T16:45:49Z","owner_type":"User","release_assets":[]}},"commit_sha":"4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987","profile":{"lines_by_language":{"Python":50257,"PowerShell":1614,"Shell":434},"files_by_category":{"vendored":685,"docs":167,"test":80,"source":66,"other":29,"config":20,"binary":4,"generated":1},"source_lines":30535,"test_lines":21770},"pillars":{"ai_provenance":{"score":81.3,"confidence":0.95,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.8134,"suspected_share":0.0319,"estimated_share":0.8134,"ai_artifacts":3.0,"flagged_work_units":14.0,"flagged_releases":1.0},"summary":"Explicit AI attribution on 81% of first-party code added; an estimated 81% including velocity signals."},"quality":{"score":63.6,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":35.0,"duplication":68.6,"lint":49.6,"testing":90.0,"docs":100.0,"type_safety":0.0,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.71, CI runs tests; 35% of function code in complex or long functions; 6% duplicated lines. Weakest area: type safety."},"security":{"score":81.2,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":93.6,"sast":82.7,"dependencies":72.9,"ci_actions":70.5,"posture":80.0,"scorecard":null},"summary":"Security posture is adequate: 5 known vulnerabilities in 3 dependencies; 14 high-severity SAST findings. Weakest area: ci actions."}},"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":25.0,"checked":25.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":198.0,"attributed_commits":176.0,"attributed_commit_share":0.8888888888888888,"effective_loc":80218.0,"attributed_loc":65251.0,"attributed_loc_share":0.8134209279712783,"tools_detected":2.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 170 attributed commits, 61,728 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attribution-summary","description":"OpenAI Codex: 6 attributed commits, 3,523 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b6dfd985cf3bb20e2bcdc38f575af854217f200e","url":"https://github.com/AgriciDaniel/claude-blog/commit/b6dfd985cf3bb20e2bcdc38f575af854217f200e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"245c6a2026e3430058b7a0730d9c9ba6d16484a5","url":"https://github.com/AgriciDaniel/claude-blog/commit/245c6a2026e3430058b7a0730d9c9ba6d16484a5","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"2581a9bc80572d03ae7edbd31f439fecc868864b","url":"https://github.com/AgriciDaniel/claude-blog/commit/2581a9bc80572d03ae7edbd31f439fecc868864b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"6255affdd5deb9120393ed468a2fa9406eb4480b","url":"https://github.com/AgriciDaniel/claude-blog/commit/6255affdd5deb9120393ed468a2fa9406eb4480b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"e17453eca8c3978df8be5846c6c967edc555fbb6","url":"https://github.com/AgriciDaniel/claude-blog/commit/e17453eca8c3978df8be5846c6c967edc555fbb6","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"309e004d7b4627d32872e38d8d000cf91fc55414","url":"https://github.com/AgriciDaniel/claude-blog/commit/309e004d7b4627d32872e38d8d000cf91fc55414","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"295b4b7d74bdac970c26317fe00df91de823a9b4","url":"https://github.com/AgriciDaniel/claude-blog/commit/295b4b7d74bdac970c26317fe00df91de823a9b4","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"2791ee0fabad5e4f4c4ad2209d6d172dc1f2d81c","url":"https://github.com/AgriciDaniel/claude-blog/commit/2791ee0fabad5e4f4c4ad2209d6d172dc1f2d81c","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"6f2d815ab2576b032c052f332aa46e1e210e87f5","url":"https://github.com/AgriciDaniel/claude-blog/commit/6f2d815ab2576b032c052f332aa46e1e210e87f5","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"320665fe2da459fc4682d99c38552ebf71e7f873","url":"https://github.com/AgriciDaniel/claude-blog/commit/320665fe2da459fc4682d99c38552ebf71e7f873","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"5ceac4cc086a831a2f267db06920b2baca12d867","url":"https://github.com/AgriciDaniel/claude-blog/commit/5ceac4cc086a831a2f267db06920b2baca12d867","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"f0480af5f174b6790fc7b8dfba2a4b74f279c181","url":"https://github.com/AgriciDaniel/claude-blog/commit/f0480af5f174b6790fc7b8dfba2a4b74f279c181","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"c34368da5317d800a6877f343dd08b770cc32145","url":"https://github.com/AgriciDaniel/claude-blog/commit/c34368da5317d800a6877f343dd08b770cc32145","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"93469c4d48cd6cb10fe2449b804a14bdad03f6cf","url":"https://github.com/AgriciDaniel/claude-blog/commit/93469c4d48cd6cb10fe2449b804a14bdad03f6cf","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"4a5bc401d31d4899d0a9479bf9bb5599a18bb8a0","url":"https://github.com/AgriciDaniel/claude-blog/commit/4a5bc401d31d4899d0a9479bf9bb5599a18bb8a0","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"354442348815a7f0327077ad89af2c43cf4b4ab4","url":"https://github.com/AgriciDaniel/claude-blog/commit/354442348815a7f0327077ad89af2c43cf4b4ab4","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"c7708db2a71539d9ba41fc89fa7efe2805d2ec6f","url":"https://github.com/AgriciDaniel/claude-blog/commit/c7708db2a71539d9ba41fc89fa7efe2805d2ec6f","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"47afd41cdf06f987f2d8ec0847e0d4725c1acbff","url":"https://github.com/AgriciDaniel/claude-blog/commit/47afd41cdf06f987f2d8ec0847e0d4725c1acbff","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"b524cd6482e022ecd585936f919b302685d9c5ca","url":"https://github.com/AgriciDaniel/claude-blog/commit/b524cd6482e022ecd585936f919b302685d9c5ca","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"58c3ff20dd397042f0de3dfb66a016ba4be44cec","url":"https://github.com/AgriciDaniel/claude-blog/commit/58c3ff20dd397042f0de3dfb66a016ba4be44cec","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"95ffdbe0b7cda9cd7fcc2e8d48db4820403d830d","url":"https://github.com/AgriciDaniel/claude-blog/commit/95ffdbe0b7cda9cd7fcc2e8d48db4820403d830d","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"e6c635c62564745d57473518365e1ae201c8ea29","url":"https://github.com/AgriciDaniel/claude-blog/commit/e6c635c62564745d57473518365e1ae201c8ea29","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"9e3cc565bb825c2cfa0eede99d6e7714e500a65f","url":"https://github.com/AgriciDaniel/claude-blog/commit/9e3cc565bb825c2cfa0eede99d6e7714e500a65f","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"1e6f13c1682c20c20ad4583b2aaedf310ce05253","url":"https://github.com/AgriciDaniel/claude-blog/commit/1e6f13c1682c20c20ad4583b2aaedf310ce05253","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"de06f664b2eb1eb692ddc84909b7044d5a13de9f","url":"https://github.com/AgriciDaniel/claude-blog/commit/de06f664b2eb1eb692ddc84909b7044d5a13de9f","weight":0.9}],"data":{"attributed_loc_by_commit":{"ee371c44c63126bac2b1a890830f9a3a1d4a5386":522,"9f9fd5932852eb1a9f666921fe7ec60691785bf3":266,"ff4147d602d92e35f4922fb12dbe7e2ebfdfffb0":0,"303f815c93b5da541433541da62e01f75032dd20":0,"ccf07f88d0e4a371b9f2c7801642405689e7484e":0,"cbd102fa31ec8468386af768367451bc621d86d3":0,"aaa085eb4dcb3dc6639e8016116c13f35b6175c9":1444,"e846aecf4159a66dff6ab9d799ac1bf197ee4668":0,"20f8de807145f999a05c75c640856fb7efd81afb":0,"c1ae8c4f553ff7e2eab607c4dea16063e6a8427c":56,"dfec31168ec8264852d2a633f9574228b1d3edab":0,"d4dfc7bd93e2a4d259987b2c0be2515fa54bcce0":6,"47240f374b9c8b17687275f2822482cf9af86dc8":0,"f7b07ed4fe05ec1df36a65aeb374a49c0742a9a0":185,"5511bcb4626aec11c3a7969985e4e4c132ae9977":0,"c839b1235a39a68f112677d9a7f34913bc19848b":0,"eee825e6e137b09d547be47cb113a6f3da86aeb6":0,"3987592cd22af3aef5feebaaf9be1b0621bd8969":0,"1c9edd19eec57cc9650ec34d64a7dfb94a6594a9":475,"52b8db53686738c65ea3cf3e531154b35395b884":0,"b4d3e15632489bf3011f951d581322532ba74f62":1,"11daa22ea2b5af9ccbfdf2dd3261050c537bcd28":0,"7e70befdbdb2e3019dcd25c784d60e81f41a98ad":5,"d498113024cacc9fc784cf5ecc4e236a1dbb2e2a":5,"137fb6e114e77d79ebaac25c23c7a16889f5ce22":0,"21de4a36b6d0b8107faf717376f8df7e4a384b5c":0,"e0c1e9682a1435744412ce8cd64854b37b95a0d7":0,"b397643d01c321233bd7b29b161236f0ca8c17f6":0,"063a923490d29141d1265854833cadcbfe49b7bc":0,"1ef6bd1c78089be42e77b10d1b19731248f7a05c":0,"9f78e886b0deeee422c613691b8fb58cd174c0a2":0,"5a8218211dd59f7055b066533528f64a65c28cda":434,"056b84497ea79c5f71401d90091e1545509b75ff":30,"49561d13a2b5ebff62a0f2e08b5cf0f88704ebf3":25,"3f79e8b10a934320f3a590331ce634b61359c4dc":0,"b76d9882cfef4ecc92d46c1b93d950e818d33f8e":0,"81a339c3ba857d012094090d290320227f7218d3":0,"1a69074e7f0a3d39add50bcd2bb14e887d5badd7":2706,"9e4f9011210e7313a287869ab857ad30962b2d90":72,"b9d6053b4eb123d13e1d5221911d427a56038032":0,"b4e4b310f7705a1039c89332667c888d62386868":0,"545cc6a53ee989a6a5df8a954c9232d05bf8c85a":0,"44e3bebc8ae0b474914d1e0a1c122c01f48767a5":0,"6a31b9a23946f70e24fc6b0b1b5762ee69682019":5178,"2276949e21dc73e54ad66aded45e3e38667a6400":0,"778464a470f9324d6660c73fa1f879d41243f02b":0,"919a2a05f20d138fcadfb00561f7d0de201431fe":0,"dbd408f6b4f855662e83985c7c91f6f1b00a8cf0":0,"51041cee7ea335420ab98562ad381f6077c0bf54":0,"71b13472a81d4eaa80b1bbc6abf23a7653bacbe3":0,"461d4b5350adbdd941ded98f35db487007ec880c":0,"7a94a1b61ba38d3d1ccfba838a397ed26a6f0994":0,"7ec55d17294b1592f2a9552d5cfed7f3eff157fe":4,"8b9b18cd407b975202193cffefa35610ffd4acf9":1,"e9bcb8fdd00771bc27bcef8df53213afd9c34af9":1,"354ad7238b62f202c2a4f50cbd01b525ea894b49":0,"a20f9d7410d3136af3c5f54e81fbb4a6c8c1f0ae":0,"bc734cbc7786dc0ce090a94fee14f2d1bacbe6d7":0,"06c45ae5d961992a8f049e41ab4170f1924ed775":392,"bb12717899822cd39ea639a62282ac5210e22b94":405,"3117e9ef5f12425edfe3598caec8c98c561f8a97":0,"8e4ed6fef3f0b35325c1d71f4bf8d3455b671a72":0,"ad4734d5bef8150d1df979beddb0ab246f8d6345":0,"f2baccf3d15e0581651f95ee3b3ec74e46c67ef7":0,"65d9f61dd70533c4efa2bcf26fb015f0525d3a0b":0,"695766d89219a2c66cfa4107b609a34c9199e695":0,"6d7d7ddcded2b131f98bf05baffdbbc9c3962b3f":0,"ebea70d8db746ec719234dae8f35e6492fb8737e":0,"8af6f6753a81c489c72010072c1ce9beefd1b915":0,"f48a719e5ccd3c00dcd7152e5172b0053d901366":92,"478c1b9ac549f013950c5b345fca247bcd688078":287,"c72877a2d1b6505d2e0d45a8bd7f572813e59f9e":136,"96ef396ced2e1b1a67187f4d7f4297cc18eb91be":33,"f4449e89620aebde5c2e108c9d6564fb22f102f8":76,"59f27beb50b0a96f92f08bc38cfbbe486ef669e0":103,"ce0690fb52cf18f16e7c48bda12faca228c06b10":0,"32831e7ccda723213f33ff5f3578fd4358f3a527":0,"2ba6d6560fb6e665ae96adc0665b1171b8500750":0,"77a7d20123838380161f651129f3a92a534a02a4":59,"de8611d9cb39a1b7ab4db2308560779c42cf512e":45,"7d525d38b6d5a1cc60ecb6731d4e60b844d14bd3":0,"1d3b40aa2c46548cc7916a50edb456823c02b99a":0,"f9fdf2a3cf7fc56e5c59b38abf16f693f6b7b3b6":1495,"da5ba9de7125d108526bfb209988e53eb05221d2":608,"c8d92c79fb51387f0bebada0800e3f2a1be5409f":161,"24ed7a31fd88e4b7ee606087a4545462995b9cf4":847,"66e159ec9e8fd4f9a1cbbc74344e94f8a73e1c93":256,"0f74346a65b5c7f349aa94bec170da1f453c35ca":522,"a330e1fc2ce03d0c93f44bb571018dbc88a22070":244,"b7fa616139306850acd4087eecc194cb964e19b2":0,"7360423bfaa847a94576180b868d8e50fb5c38da":721,"259dfe84dfd1abf11afa7a279a68a3a53466db9d":0,"00a0ab35c171ddcfa4887cdde39ddb02ff465566":0,"dda5ccc0ff4233f1a359ff3a270a974f5d3f79c7":288,"109cb6152accc5258fd0a4288d770df36ee9611a":169,"2422526e241d3e6796a7a7aaa2a781b62db3eb91":256,"d36e88a0558ba123c6935e98d8e202b13ccfa9fe":0,"f9ff6eeab19c2d34399fa067d3a801e7251cde6e":95,"1b56d420e796120e1cf9f361472c91999c880213":0,"91c3003046622720be020153e56a1ea937fe3bc9":25,"532fcd3e7577623f5ad2372cd40cdb2d6e1d14e0":23,"ab0b1b2c4ead974477026f9dbcca3f857e690111":9,"b122c4795f4f4032a219a37dc8ab79a4f846b3bf":28,"23e414f92f17ce8113c0f0fd9e1756058eb73a58":0,"c383f06311993b65fab9470580ec4fb7e531d658":0,"0fbaa9111ff88661699b122b15ad6aa5a003c3a6":0,"d00636da00b7c902ebe39867ca5322259437fd9b":0,"49842ea9e7b9a1f6f8a3774a3fcfb082ab6a7d25":0,"d986df2d3dab200007edee2e3a257a6f25b3e799":1587,"cf2e93cb1461909963a81ca40b7c50198e7258b6":0,"0fbe1c072d6b0cde522d7b6504938fbdaaea12f8":0,"283ee1fac7a714a96c29755fabd1429a857412cc":2281,"ea2e789d7c4f65f762b6dc61adabda13dd6e4d7e":0,"8e6925fcae66a1edd44b88811911b8bd21ef81c2":0,"cdb818b37ca52f783824709da3a01f5c0548742b":1467,"9f19396c48e0797e8e871c7a6134d8e54c47118c":0,"be5418bf800734a87a6d2754ba2a3fd1e82f3ee9":0,"6f2dc4d04a1c2a05e83a94f910355489952ff3de":0,"97cb96fa1a1843432f67c819d6c9a98abca49aab":0,"6a145ad20fe2785813743e361f84e76909984306":0,"1c9cdc6927408c0a36d2ff58ae4d5184f8699476":384,"63312db9c73ea8abc6fb54e1981aee2d46f70170":379,"f31393d841933629853d62592dd867f590d327d2":0,"5c21c90bc0d86302045300071b26130de5dd0e26":3889,"48647218dc722d7d3b5cfcde26435fa5eacc9037":882,"1567ed307bb1851a312e117bd2ec77872cf54797":343,"9bab006c6dcb973d41e62096c90cb91891cde578":11,"fe73e02b629e14beb579ca5a74e7f6b0842291f2":0,"35c95bc8d5f441ba5b0338abc4b453a0dcf74e59":0,"8cd69fd6ab1ee4c1ddc61ca95272f983ef24e97d":0,"cb0d7d95beae2685343f426f9cc7a833d4d18123":0,"234c8e595c47601845aed1a9cd22328096c1c657":2,"9d998bc90e162371a4a909f6353ab1b6edb998ed":8970,"2020316123a3ca01b5983762dba3b67e947b45dc":1298,"31008f2ac5fb317afbba034bf26af7221a325b41":2540,"b953beb1bd1e3d7a8172761d482e34b9208955d2":120,"c4b812fdc61d9fe2b55cd250b8ac2da38a46e670":0,"6e34a4a7aa0599622fbdda093ab686aa7c95c121":0,"60c517a506214e9c8b036bd5f018d3f0c9dff367":0,"7cbe2152294c6864d54b40e8be7c378becacccfb":0,"1921d5b2a560f38d12b071c4bc34628221f881ab":7,"b0f118c056ef0bb6d868ae8f5b8a6624ea81abe7":2,"e74a6518f60153d5c3cb1a0499298e878bdd1c17":2,"bab0d5c957d64b68fa5d708b132c4fba53a0b052":3282,"0a006be88f39a3381a03a7364d037b222a50d24c":186,"d40ec682ec9f12dfe83f59801ba3d261e17ea60b":0,"709756706b2f498e7c3473718d4287f83b575a7e":0,"20d33efeac990e9e04ecacc0f9a75bb1542558ab":0,"39c1cc4f03c17eced89a5a66574135e7da0a8ede":55,"de06f664b2eb1eb692ddc84909b7044d5a13de9f":969,"bea2ccb7f54adfe2430136f6831604aa307178e5":8654,"6b7e2b29c85cd9dffc9159d30eada137bb2eb6df":2359,"1e6f13c1682c20c20ad4583b2aaedf310ce05253":381,"9e3cc565bb825c2cfa0eede99d6e7714e500a65f":1,"e6c635c62564745d57473518365e1ae201c8ea29":24,"95ffdbe0b7cda9cd7fcc2e8d48db4820403d830d":0,"58c3ff20dd397042f0de3dfb66a016ba4be44cec":6,"b524cd6482e022ecd585936f919b302685d9c5ca":1757,"47afd41cdf06f987f2d8ec0847e0d4725c1acbff":29,"c7708db2a71539d9ba41fc89fa7efe2805d2ec6f":1,"354442348815a7f0327077ad89af2c43cf4b4ab4":0,"4a5bc401d31d4899d0a9479bf9bb5599a18bb8a0":0,"93469c4d48cd6cb10fe2449b804a14bdad03f6cf":0,"c34368da5317d800a6877f343dd08b770cc32145":1118,"f0480af5f174b6790fc7b8dfba2a4b74f279c181":1242,"320665fe2da459fc4682d99c38552ebf71e7f873":0,"5ceac4cc086a831a2f267db06920b2baca12d867":0,"2791ee0fabad5e4f4c4ad2209d6d172dc1f2d81c":1152,"6f2d815ab2576b032c052f332aa46e1e210e87f5":872,"6255affdd5deb9120393ed468a2fa9406eb4480b":0,"e17453eca8c3978df8be5846c6c967edc555fbb6":6,"309e004d7b4627d32872e38d8d000cf91fc55414":1,"295b4b7d74bdac970c26317fe00df91de823a9b4":0,"2581a9bc80572d03ae7edbd31f439fecc868864b":0,"245c6a2026e3430058b7a0730d9c9ba6d16484a5":201,"b6dfd985cf3bb20e2bcdc38f575af854217f200e":0},"tools":{"claude-code":{"name":"Claude Code","commits":170,"loc":61728,"first_seen":1771368029,"last_seen":1793663812},"openai-codex":{"name":"OpenAI Codex","commits":6,"loc":3523,"first_seen":1784822727,"last_seen":1791395331}},"monthly":{"2026-02":{"loc":2482,"attributed_loc":2479},"2026-03":{"loc":8931,"attributed_loc":8931},"2026-04":{"loc":1634,"attributed_loc":1634},"2026-05":{"loc":7605,"attributed_loc":5747},"2026-07":{"loc":27632,"attributed_loc":27632},"2026-08":{"loc":2019,"attributed_loc":0},"2026-09":{"loc":0,"attributed_loc":0},"2026-10":{"loc":29915,"attributed_loc":18828},"2026-11":{"loc":0,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":3.0,"workflow_agents":0.0,"tools_configured":2.0,"earliest_adoption":1773046923.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":"CLAUDE.md (claude-code configuration)","ref":"CLAUDE.md","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/CLAUDE.md","weight":0.5},{"kind":"ai-artifact","description":"brain/CLAUDE.md (claude-code configuration)","ref":"brain/CLAUDE.md","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/brain/CLAUDE.md","weight":0.5},{"kind":"ai-artifact","description":"brain/AGENTS.md (generic-agent configuration)","ref":"brain/AGENTS.md","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/brain/AGENTS.md","weight":0.5}],"data":{"artifacts":[{"tool":"claude-code","path":"CLAUDE.md","added_at":1773046923},{"tool":"claude-code","path":"brain/CLAUDE.md","added_at":null},{"tool":"generic-agent","path":"brain/AGENTS.md","added_at":null}],"workflows":[],"tools":["claude-code","generic-agent"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":43.0,"flagged_units":14.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":62088.0,"flagged_loc":50639.0,"flagged_loc_share":0.8156004380878753,"max_loc_per_hour":6706.0,"median_loc_per_hour":583.7971552257266,"pr_timed_units":2.0,"excluded_import_loc":14735.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"3,353 lines of first-party code in ~0.5h (6,706 lines/hour, 4 commit session)","ref":"e6c635c62564745d57473518365e1ae201c8ea29","url":"https://github.com/AgriciDaniel/claude-blog/commit/e6c635c62564745d57473518365e1ae201c8ea29","weight":0.6},{"kind":"velocity-burst","description":"8,970 lines of first-party code in ~1.4h (6,384 lines/hour, 1 commit session)","ref":"9d998bc90e162371a4a909f6353ab1b6edb998ed","url":"https://github.com/AgriciDaniel/claude-blog/commit/9d998bc90e162371a4a909f6353ab1b6edb998ed","weight":0.6},{"kind":"velocity-burst","description":"2,558 lines of first-party code in ~0.9h (2,894 lines/hour, 3 commit session)","ref":"c69f7d91e148ca59fd4660d8950de09b5525dfcd","url":"https://github.com/AgriciDaniel/claude-blog/commit/c69f7d91e148ca59fd4660d8950de09b5525dfcd","weight":0.6},{"kind":"velocity-burst","description":"1,792 lines of first-party code in ~0.8h (2,207 lines/hour, 3 commit session)","ref":"47afd41cdf06f987f2d8ec0847e0d4725c1acbff","url":"https://github.com/AgriciDaniel/claude-blog/commit/47afd41cdf06f987f2d8ec0847e0d4725c1acbff","weight":0.6},{"kind":"velocity-burst","description":"5,178 lines of first-party code in ~4.0h (1,294 lines/hour, 1 commit session)","ref":"6a31b9a23946f70e24fc6b0b1b5762ee69682019","url":"https://github.com/AgriciDaniel/claude-blog/commit/6a31b9a23946f70e24fc6b0b1b5762ee69682019","weight":0.38835},{"kind":"velocity-burst","description":"5,335 lines of first-party code in ~4.7h (1,138 lines/hour, 3 commit session)","ref":"cdb818b37ca52f783824709da3a01f5c0548742b","url":"https://github.com/AgriciDaniel/claude-blog/commit/cdb818b37ca52f783824709da3a01f5c0548742b","weight":0.34144},{"kind":"velocity-burst","description":"5,114 lines of first-party code in ~4.6h (1,103 lines/hour, 3 commit session)","ref":"1567ed307bb1851a312e117bd2ec77872cf54797","url":"https://github.com/AgriciDaniel/claude-blog/commit/1567ed307bb1851a312e117bd2ec77872cf54797","weight":0.33076536112109234},{"kind":"velocity-burst","description":"1,710 lines of first-party code in ~1.7h (1,024 lines/hour, 2 commit session)","ref":"aaa085eb4dcb3dc6639e8016116c13f35b6175c9","url":"https://github.com/AgriciDaniel/claude-blog/commit/aaa085eb4dcb3dc6639e8016116c13f35b6175c9","weight":0.30733899151273086},{"kind":"velocity-burst","description":"3,838 lines of first-party code in ~4.1h (946 lines/hour, 2 commit session)","ref":"31008f2ac5fb317afbba034bf26af7221a325b41","url":"https://github.com/AgriciDaniel/claude-blog/commit/31008f2ac5fb317afbba034bf26af7221a325b41","weight":0.2838096542280041},{"kind":"velocity-burst","description":"2,030 lines of first-party code in ~2.4h (837 lines/hour, 5 commit session)","ref":"a330e1fc2ce03d0c93f44bb571018dbc88a22070","url":"https://github.com/AgriciDaniel/claude-blog/commit/a330e1fc2ce03d0c93f44bb571018dbc88a22070","weight":0.25116279069767444},{"kind":"velocity-burst","description":"3,464 lines of first-party code in ~4.7h (733 lines/hour, 2 commit session)","ref":"0a006be88f39a3381a03a7364d037b222a50d24c","url":"https://github.com/AgriciDaniel/claude-blog/commit/0a006be88f39a3381a03a7364d037b222a50d24c","weight":0.2200141143260409},{"kind":"velocity-burst","description":"2,706 lines of first-party code in ~4.0h (676 lines/hour, 1 commit session)","ref":"1a69074e7f0a3d39add50bcd2bb14e887d5badd7","url":"https://github.com/AgriciDaniel/claude-blog/commit/1a69074e7f0a3d39add50bcd2bb14e887d5badd7","weight":0.20295},{"kind":"velocity-burst","description":"2,231 lines of first-party code in ~3.5h (646 lines/hour, 4 commit session)","ref":"245c6a2026e3430058b7a0730d9c9ba6d16484a5","url":"https://github.com/AgriciDaniel/claude-blog/commit/245c6a2026e3430058b7a0730d9c9ba6d16484a5","weight":0.1937348235104929},{"kind":"velocity-burst","description":"2,360 lines of first-party code in ~4.0h (584 lines/hour, 2 commit session)","ref":"f0480af5f174b6790fc7b8dfba2a4b74f279c181","url":"https://github.com/AgriciDaniel/claude-blog/commit/f0480af5f174b6790fc7b8dfba2a4b74f279c181","weight":0.17513914656771795}],"data":{"flagged_loc_by_commit":{"9f9fd5932852eb1a9f666921fe7ec60691785bf3":266,"aaa085eb4dcb3dc6639e8016116c13f35b6175c9":1444,"d986df2d3dab200007edee2e3a257a6f25b3e799":1587,"283ee1fac7a714a96c29755fabd1429a857412cc":2281,"cdb818b37ca52f783824709da3a01f5c0548742b":1467,"6c3cb9a30db622baf8429f2b47fdb9cbe1f170b6":1665,"1f0a1a5b11de2e001bf534ee32a20f1315f9fe81":786,"c69f7d91e148ca59fd4660d8950de09b5525dfcd":107,"de06f664b2eb1eb692ddc84909b7044d5a13de9f":969,"6b7e2b29c85cd9dffc9159d30eada137bb2eb6df":2359,"9e3cc565bb825c2cfa0eede99d6e7714e500a65f":1,"e6c635c62564745d57473518365e1ae201c8ea29":24,"58c3ff20dd397042f0de3dfb66a016ba4be44cec":6,"b524cd6482e022ecd585936f919b302685d9c5ca":1757,"47afd41cdf06f987f2d8ec0847e0d4725c1acbff":29,"c34368da5317d800a6877f343dd08b770cc32145":1118,"f0480af5f174b6790fc7b8dfba2a4b74f279c181":1242,"2791ee0fabad5e4f4c4ad2209d6d172dc1f2d81c":1152,"6f2d815ab2576b032c052f332aa46e1e210e87f5":872,"e17453eca8c3978df8be5846c6c967edc555fbb6":6,"245c6a2026e3430058b7a0730d9c9ba6d16484a5":201,"1a69074e7f0a3d39add50bcd2bb14e887d5badd7":2706,"6a31b9a23946f70e24fc6b0b1b5762ee69682019":5178,"c8d92c79fb51387f0bebada0800e3f2a1be5409f":161,"24ed7a31fd88e4b7ee606087a4545462995b9cf4":847,"66e159ec9e8fd4f9a1cbbc74344e94f8a73e1c93":256,"0f74346a65b5c7f349aa94bec170da1f453c35ca":522,"a330e1fc2ce03d0c93f44bb571018dbc88a22070":244,"5c21c90bc0d86302045300071b26130de5dd0e26":3889,"48647218dc722d7d3b5cfcde26435fa5eacc9037":882,"1567ed307bb1851a312e117bd2ec77872cf54797":343,"9d998bc90e162371a4a909f6353ab1b6edb998ed":8970,"2020316123a3ca01b5983762dba3b67e947b45dc":1298,"31008f2ac5fb317afbba034bf26af7221a325b41":2540,"bab0d5c957d64b68fa5d708b132c4fba53a0b052":3278,"0a006be88f39a3381a03a7364d037b222a50d24c":186},"excluded_import_commits":["bea2ccb7f54adfe2430136f6831604aa307178e5","f450d21f25a93aea7b4f8a0c981889a8063b7101"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":30.0,"flagged_releases":1.0,"max_loc_per_day":42864.0},"findings":[],"evidence":[{"kind":"release-burst","description":"v1.6.2 → v1.6.5: 5,178 lines in 0.94 days (5,512.2 lines/day)","ref":"v1.6.2...v1.6.5","url":"https://github.com/AgriciDaniel/claude-blog/compare/v1.6.2...v1.6.5","weight":0.4}],"data":{"releases":[{"from":"v1.0.0","to":"v1.1.0","loc":6,"days":0.04,"loc_per_day":144.0,"flagged":false},{"from":"v1.1.0","to":"v1.2.0","loc":185,"days":0.79,"loc_per_day":233.4,"flagged":false},{"from":"v1.2.0","to":"v1.2.1","loc":3,"days":15.81,"loc_per_day":0.2,"flagged":false},{"from":"v1.2.1","to":"v1.3.0","loc":481,"days":0.04,"loc_per_day":11544.0,"flagged":false},{"from":"v1.3.0","to":"v1.3.1","loc":5,"days":0.04,"loc_per_day":120.0,"flagged":false},{"from":"v1.3.1","to":"v1.4.0","loc":434,"days":8.79,"loc_per_day":49.4,"flagged":false},{"from":"v1.4.0","to":"v1.5.0","loc":55,"days":3.29,"loc_per_day":16.7,"flagged":false},{"from":"v1.5.0","to":"v1.6.0","loc":2706,"days":6.98,"loc_per_day":387.6,"flagged":false},{"from":"v1.6.0","to":"v1.6.1","loc":72,"days":1.76,"loc_per_day":40.9,"flagged":false},{"from":"v1.6.1","to":"v1.6.2","loc":0,"days":0.05,"loc_per_day":0.0,"flagged":false},{"from":"v1.6.2","to":"v1.6.5","loc":5178,"days":0.94,"loc_per_day":5512.2,"flagged":true},{"from":"v1.6.5","to":"v1.6.6","loc":0,"days":10.86,"loc_per_day":0.0,"flagged":false},{"from":"v1.6.6","to":"v1.6.7","loc":0,"days":0.22,"loc_per_day":0.0,"flagged":false},{"from":"v1.6.7","to":"v1.6.8","loc":4,"days":0.07,"loc_per_day":57.0,"flagged":false},{"from":"v1.6.8","to":"v1.6.9","loc":2,"days":1.86,"loc_per_day":1.1,"flagged":false},{"from":"v1.6.9","to":"v1.7.1","loc":1628,"days":20.36,"loc_per_day":80.0,"flagged":false},{"from":"v1.7.1","to":"v1.8.0","loc":1495,"days":16.05,"loc_per_day":93.1,"flagged":false},{"from":"v1.8.0","to":"v1.8.1","loc":608,"days":0.04,"loc_per_day":14592.0,"flagged":false},{"from":"v1.8.1","to":"v1.8.2","loc":161,"days":0.04,"loc_per_day":3864.0,"flagged":false},{"from":"v1.8.2","to":"v1.8.3","loc":847,"days":0.04,"loc_per_day":20328.0,"flagged":false},{"from":"v1.8.3","to":"v1.8.4","loc":256,"days":0.04,"loc_per_day":6144.0,"flagged":false},{"from":"v1.8.4","to":"v1.8.5","loc":522,"days":0.04,"loc_per_day":12528.0,"flagged":false},{"from":"v1.8.5","to":"v1.8.6","loc":244,"days":0.04,"loc_per_day":5856.0,"flagged":false},{"from":"v1.8.6","to":"v1.9.0","loc":1858,"days":1.42,"loc_per_day":1312.9,"flagged":false},{"from":"v1.9.0","to":"v1.9.1","loc":1614,"days":0.21,"loc_per_day":7740.3,"flagged":false},{"from":"v1.9.1","to":"v2.1.1","loc":27632,"days":66.04,"loc_per_day":418.4,"flagged":false},{"from":"v2.1.1","to":"v2.2.0","loc":1669,"days":33.23,"loc_per_day":50.2,"flagged":false},{"from":"v2.2.0","to":"v2.3.0","loc":8442,"days":48.82,"loc_per_day":172.9,"flagged":false},{"from":"v2.3.0","to":"v2.3.1","loc":1786,"days":0.04,"loc_per_day":42864.0,"flagged":false},{"from":"v2.3.1","to":"v2.3.2","loc":4593,"days":20.21,"loc_per_day":227.3,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":30535.0,"index":1.768,"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":108.0,"per_kloc:emoji_in_code":3.537,"files:emoji_in_code":8.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":2.0,"secrets_low_confidence":0.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit 9d998bc90e); removed from the current tree but still retrievable","path":".raw/sources/claude-blog-skill/docs/ARCHITECTURE.md","line":207,"fingerprint":"9d998bc90e162371a4a909f6353ab1b6edb998ed:.raw/sources/claude-blog-skill/docs/ARCHITECTURE.md:generic-api-key:207"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in history (commit c59e6ea69e); removed from the current tree but still retrievable","path":"docs/ARCHITECTURE.md","line":195,"fingerprint":"c59e6ea69e89205b385b76ac43d2fe05dc10a639:docs/ARCHITECTURE.md:generic-api-key:195"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":20.0,"findings_high":14.0,"findings_medium":6.0,"findings_low":0.0,"weighted_findings":15.85,"scanned_lines":29271.0,"parse_errors":2.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":".github/scripts/validate_plugin_tolerate_reserved_name.py","line":192,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:.github/scripts/validate_plugin_tolerate_reserved_name.py:192"},{"rule_id":"opengrep/python.lang.security.use-defused-xml","severity":"high","message":"The Python documentation recommends using `defusedxml` instead of `xml` because the native Python `xml` library is vulnerable to XML External Entity (XXE) attacks. These attacks can leak confidential data and \"XML bombs\" can cause denial of service. [confidence low]","path":"scripts/check_google_currentness.py","line":12,"fingerprint":"python.lang.security.use-defused-xml:scripts/check_google_currentness.py:12"},{"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/check_secrets.py","line":98,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:scripts/check_secrets.py:98"},{"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":"skills/blog-audio/scripts/run.py","line":111,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:skills/blog-audio/scripts/run.py:111"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-tainted-env-args","severity":"high","message":"Detected subprocess function 'run' with user controlled data. A malicious actor could leverage this to perform command injection. You may consider using 'shlex.quote()'. [confidence medium]","path":"skills/blog-audio/scripts/run.py","line":111,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-tainted-env-args:skills/blog-audio/scripts/run.py:111"},{"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":"skills/blog-audio/scripts/setup_environment.py","line":80,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:skills/blog-audio/scripts/setup_environment.py:80"},{"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":"skills/blog-google/scripts/run.py","line":121,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:skills/blog-google/scripts/run.py:121"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-tainted-env-args","severity":"high","message":"Detected subprocess function 'run' with user controlled data. A malicious actor could leverage this to perform command injection. You may consider using 'shlex.quote()'. [confidence medium]","path":"skills/blog-google/scripts/run.py","line":121,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-tainted-env-args:skills/blog-google/scripts/run.py:121"},{"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":"skills/blog-google/scripts/setup_environment.py","line":77,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:skills/blog-google/scripts/setup_environment.py:77"},{"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":"skills/blog-notebooklm/scripts/run.py","line":116,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:skills/blog-notebooklm/scripts/run.py:116"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-tainted-env-args","severity":"high","message":"Detected subprocess function 'run' with user controlled data. A malicious actor could leverage this to perform command injection. You may consider using 'shlex.quote()'. [confidence medium]","path":"skills/blog-notebooklm/scripts/run.py","line":116,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-tainted-env-args:skills/blog-notebooklm/scripts/run.py:116"},{"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":"skills/blog-notebooklm/scripts/setup_environment.py","line":85,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:skills/blog-notebooklm/scripts/setup_environment.py:85"},{"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":"skills/blog-notebooklm/scripts/setup_environment.py","line":100,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:skills/blog-notebooklm/scripts/setup_environment.py:100"},{"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":"skills/blog-notebooklm/scripts/setup_environment.py","line":216,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:skills/blog-notebooklm/scripts/setup_environment.py:216"},{"rule_id":"opengrep/python.lang.security.audit.insecure-file-permissions","severity":"medium","message":"These permissions `0o700` are widely permissive and grant access to more people than may be necessary. A good default is `0o644` which gives read and write access to yourself and read access to everyone else. [confidence medium]","path":"scripts/blog_preflight.py","line":182,"fingerprint":"python.lang.security.audit.insecure-file-permissions:scripts/blog_preflight.py:182"},{"rule_id":"opengrep/python.lang.security.audit.insecure-file-permissions","severity":"medium","message":"These permissions `0o700` are widely permissive and grant access to more people than may be necessary. A good default is `0o644` which gives read and write access to yourself and read access to everyone else. [confidence medium]","path":"scripts/blog_preflight.py","line":376,"fingerprint":"python.lang.security.audit.insecure-file-permissions:scripts/blog_preflight.py:376"},{"rule_id":"opengrep/python.lang.security.audit.dynamic-urllib-use-detected","severity":"medium","message":"Detected a dynamic value being used with urllib. urllib supports 'file://' schemes, so a dynamic value controlled by a malicious actor may allow them to read arbitrary files. Audit uses of urllib calls to ensure user data cannot control the URLs, or consider using the 'requests' library instead. [confidence low]","path":"scripts/check_google_currentness.py","line":39,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/check_google_currentness.py:39"},{"rule_id":"opengrep/python.lang.security.audit.regex_dos","severity":"medium","message":"Detected usage of re.compile with an inefficient regular expression. This can lead to regular expression denial of service, which can result in service down time. Instead, check all regexes or use safer alternatives such as pyre2. [confidence low]","path":"scripts/cognitive_load.py","line":110,"fingerprint":"python.lang.security.audit.regex_dos:scripts/cognitive_load.py:110"},{"rule_id":"opengrep/python.lang.security.audit.dynamic-urllib-use-detected","severity":"medium","message":"Detected a dynamic value being used with urllib. urllib supports 'file://' schemes, so a dynamic value controlled by a malicious actor may allow them to read arbitrary files. Audit uses of urllib calls to ensure user data cannot control the URLs, or consider using the 'requests' library instead. [confidence low]","path":"skills/blog-google/scripts/google_auth.py","line":449,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:skills/blog-google/scripts/google_auth.py:449"},{"rule_id":"opengrep/python.lang.security.audit.dynamic-urllib-use-detected","severity":"medium","message":"Detected a dynamic value being used with urllib. urllib supports 'file://' schemes, so a dynamic value controlled by a malicious actor may allow them to read arbitrary files. Audit uses of urllib calls to ensure user data cannot control the URLs, or consider using the 'requests' library instead. [confidence low]","path":"skills/blog-google/scripts/google_auth.py","line":674,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:skills/blog-google/scripts/google_auth.py:674"}],"evidence":[],"data":{"rulesets":["python","bash"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":3.0,"vulnerabilities":5.0,"vulns_critical":0.0,"vulns_high":3.0,"vulns_medium":2.0,"vulns_low":0.0,"vulns_unknown":0.0,"penalty":19.0},"findings":[{"rule_id":"osv/GHSA-3jp2-3mrg-2vxc","severity":"high","message":"oauthlib@4.0.0 (PyPI) is affected by GHSA-3jp2-3mrg-2vxc","path":"uv.lock","line":null,"fingerprint":"oauthlib@4.0.0 (PyPI):GHSA-3jp2-3mrg-2vxc"},{"rule_id":"osv/GHSA-6655-6qjp-jx7x","severity":"high","message":"soupsieve@2.10 (PyPI) is affected by GHSA-6655-6qjp-jx7x","path":"uv.lock","line":null,"fingerprint":"soupsieve@2.10 (PyPI):GHSA-6655-6qjp-jx7x"},{"rule_id":"osv/GHSA-mmhr-3c5m-f64f","severity":"high","message":"soupsieve@2.10 (PyPI) is affected by GHSA-mmhr-3c5m-f64f","path":"uv.lock","line":null,"fingerprint":"soupsieve@2.10 (PyPI):GHSA-mmhr-3c5m-f64f"},{"rule_id":"osv/GHSA-mf5v-w3w3-f6cg","severity":"medium","message":"opentelemetry-api@1.45.1 (PyPI) is affected by GHSA-mf5v-w3w3-f6cg","path":"uv.lock","line":null,"fingerprint":"opentelemetry-api@1.45.1 (PyPI):GHSA-mf5v-w3w3-f6cg"},{"rule_id":"osv/GHSA-7g44-g9rc-x53w","severity":"medium","message":"soupsieve@2.10 (PyPI) is affected by GHSA-7g44-g9rc-x53w","path":"uv.lock","line":null,"fingerprint":"soupsieve@2.10 (PyPI):GHSA-7g44-g9rc-x53w"}],"evidence":[],"data":{"ecosystems":["PyPI"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":2.0,"findings":6.0,"findings_high":0.0,"findings_medium":5.0,"findings_low":1.0,"penalty":21.0},"findings":[{"rule_id":"zizmor/dependabot-cooldown","severity":"medium","message":"insufficient cooldown in Dependabot updates [confidence high]","path":".github/dependabot.yml","line":24,"fingerprint":"dependabot-cooldown:.github/dependabot.yml:24"},{"rule_id":"zizmor/dependabot-cooldown","severity":"medium","message":"insufficient cooldown in Dependabot updates [confidence high]","path":".github/dependabot.yml","line":46,"fingerprint":"dependabot-cooldown:.github/dependabot.yml:46"},{"rule_id":"zizmor/dependabot-cooldown","severity":"medium","message":"insufficient cooldown in Dependabot updates [confidence high]","path":".github/dependabot.yml","line":67,"fingerprint":"dependabot-cooldown:.github/dependabot.yml:67"},{"rule_id":"zizmor/dependabot-cooldown","severity":"medium","message":"insufficient cooldown in Dependabot updates [confidence high]","path":".github/dependabot.yml","line":88,"fingerprint":"dependabot-cooldown:.github/dependabot.yml:88"},{"rule_id":"zizmor/dependabot-cooldown","severity":"medium","message":"insufficient cooldown in Dependabot updates [confidence high]","path":".github/dependabot.yml","line":110,"fingerprint":"dependabot-cooldown:.github/dependabot.yml:110"},{"rule_id":"zizmor/adhoc-packages","severity":"low","message":"ad-hoc installation of packages [confidence high]","path":".github/workflows/ci.yml","line":175,"fingerprint":"adhoc-packages:.github/workflows/ci.yml:175"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":1.0,"check:dependency_updates":1.0,"check:signed_commits":0.0,"check:lockfiles":0.0,"signed_commit_share":0.3838,"unpinned_manifests":1.0},"findings":[],"evidence":[{"kind":"posture","description":"Security policy: .github/SECURITY.md","ref":".github/SECURITY.md","url":null,"weight":0.0},{"kind":"posture","description":"Dependency updates: .github/dependabot.yml","ref":".github/dependabot.yml","url":null,"weight":0.0},{"kind":"posture","description":"brain/site/package.json has no lockfile alongside it (unpinned dependencies)","ref":"brain/site/package.json","url":null,"weight":0.3}],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":907.0,"function_nloc":19336.0,"mean_ccn":6.7,"p90_ccn":15.0,"complex_functions":80.0,"long_functions":23.0,"many_param_functions":3.0,"risky_nloc_share":0.3498},"findings":[],"evidence":[{"kind":"complex-function","description":"calculate_score in scripts/analyze_blog.py: complexity 139, 474 lines","ref":"scripts/analyze_blog.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/analyze_blog.py#L1470","weight":1.0},{"kind":"complex-function","description":"gate_5_asset_link_integrity in scripts/blog_preflight.py: complexity 80, 240 lines","ref":"scripts/blog_preflight.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/blog_preflight.py#L2766","weight":1.0},{"kind":"complex-function","description":"validate in scripts/validate_public_release.py: complexity 79, 322 lines","ref":"scripts/validate_public_release.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/validate_public_release.py#L105","weight":1.0},{"kind":"complex-function","description":"_jsonld_identity_report in scripts/blog_preflight.py: complexity 77, 87 lines","ref":"scripts/blog_preflight.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/blog_preflight.py#L2231","weight":1.0},{"kind":"complex-function","description":"run_pagespeed in skills/blog-google/scripts/pagespeed_check.py: complexity 52, 183 lines","ref":"skills/blog-google/scripts/pagespeed_check.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/skills/blog-google/scripts/pagespeed_check.py#L76","weight":0.8666666666666667},{"kind":"complex-function","description":"gate_4_content_review in scripts/blog_preflight.py: complexity 50, 116 lines","ref":"scripts/blog_preflight.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/blog_preflight.py#L3092","weight":0.8333333333333334},{"kind":"complex-function","description":"_inspect_status in scripts/blog_studio_status.py: complexity 48, 72 lines","ref":"scripts/blog_studio_status.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/blog_studio_status.py#L326","weight":0.8},{"kind":"complex-function","description":"_reference_errors in scripts/consistency_check.py: complexity 44, 108 lines","ref":"scripts/consistency_check.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/consistency_check.py#L105","weight":0.7333333333333333},{"kind":"complex-function","description":"handle_starttag in scripts/analyze_blog.py: complexity 43, 86 lines","ref":"scripts/analyze_blog.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/analyze_blog.py#L413","weight":0.7166666666666667},{"kind":"complex-function","description":"gate_3_visual_verification in scripts/blog_preflight.py: complexity 43, 169 lines","ref":"scripts/blog_preflight.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/blog_preflight.py#L1472","weight":0.7166666666666667}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":24176.0,"duplicated_lines":1521.0,"duplicated_share":0.0629,"files":66.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: install.ps1:71 and uninstall.ps1:23","ref":"install.ps1","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/install.ps1#L71","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: install.sh:71 and uninstall.sh:13","ref":"install.sh","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/install.sh#L71","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/ai_citation_score.py:117 and scripts/ai_citation_score.py:311","ref":"scripts/ai_citation_score.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/ai_citation_score.py#L117","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/analyze_blog.py:49 and scripts/blog_preflight.py:61","ref":"scripts/analyze_blog.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/analyze_blog.py#L49","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/analyze_blog.py:272 and scripts/content_decay.py:447","ref":"scripts/analyze_blog.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/analyze_blog.py#L272","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/blog_preflight.py:133 and scripts/blog_preflight.py:152","ref":"scripts/blog_preflight.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/blog_preflight.py#L133","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/blog_preflight.py:627 and scripts/generate_hero.py:222","ref":"scripts/blog_preflight.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/blog_preflight.py#L627","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/cognitive_load.py:402 and scripts/discourse_research.py:143","ref":"scripts/cognitive_load.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/cognitive_load.py#L402","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/cognitive_load.py:442 and scripts/load_untrusted_root.py:112","ref":"scripts/cognitive_load.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/cognitive_load.py#L442","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/generate_hero.py:327 and scripts/generate_hero.py:345","ref":"scripts/generate_hero.py","url":"https://github.com/AgriciDaniel/claude-blog/blob/4f9c2cb8fd17f594e868d6c2ce0e8fb2c971f987/scripts/generate_hero.py#L327","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":66.0,"weighted_findings":82.0,"scanned_lines":29271.0,"category:best-practice":24.0,"category:correctness":10.0,"category:maintainability":32.0},"findings":[{"rule_id":"opengrep/python.lang.correctness.common-mistakes.identical-is-comparison","severity":"high","message":"Found identical comparison using is. Ensure this is what you intended.","path":"scripts/blog_preflight.py","line":1486,"fingerprint":"python.lang.correctness.common-mistakes.identical-is-comparison:scripts/blog_preflight.py:1486"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/check_google_currentness.py","line":44,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/check_google_currentness.py:44"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"skills/blog-google/scripts/gsc_inspect.py","line":438,"fingerprint":"python.lang.best-practice.arbitrary-sleep:skills/blog-google/scripts/gsc_inspect.py:438"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"skills/blog-google/scripts/indexing_notify.py","line":351,"fingerprint":"python.lang.best-practice.arbitrary-sleep:skills/blog-google/scripts/indexing_notify.py:351"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"skills/blog-notebooklm/scripts/ask_question.py","line":145,"fingerprint":"python.lang.best-practice.arbitrary-sleep:skills/blog-notebooklm/scripts/ask_question.py:145"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"skills/blog-notebooklm/scripts/ask_question.py","line":174,"fingerprint":"python.lang.best-practice.arbitrary-sleep:skills/blog-notebooklm/scripts/ask_question.py:174"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"skills/blog-notebooklm/scripts/browser_session.py","line":184,"fingerprint":"python.lang.best-practice.arbitrary-sleep:skills/blog-notebooklm/scripts/browser_session.py:184"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"skills/blog-notebooklm/scripts/browser_session.py","line":210,"fingerprint":"python.lang.best-practice.arbitrary-sleep:skills/blog-notebooklm/scripts/browser_session.py:210"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"scripts/ai_citation_score.py","line":427,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:scripts/ai_citation_score.py:427"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"scripts/ai_citation_score.py","line":432,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:scripts/ai_citation_score.py:432"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"scripts/blog_preflight.py","line":315,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:scripts/blog_preflight.py:315"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_global\" a function or an attribute? If it is a function, you may have meant addr.is_global() because addr.is_global is always true.","path":"scripts/blog_preflight.py","line":612,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/blog_preflight.py:612"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_loopback\" a function or an attribute? If it is a function, you may have meant addr.is_loopback() because addr.is_loopback is always true.","path":"scripts/blog_preflight.py","line":612,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/blog_preflight.py:612"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_link_local\" a function or an attribute? If it is a function, you may have meant addr.is_link_local() because addr.is_link_local is always true.","path":"scripts/blog_preflight.py","line":612,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/blog_preflight.py:612"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_multicast\" a function or an attribute? If it is a function, you may have meant addr.is_multicast() because addr.is_multicast is always true.","path":"scripts/blog_preflight.py","line":612,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/blog_preflight.py:612"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_unspecified\" a function or an attribute? If it is a function, you may have meant addr.is_unspecified() because addr.is_unspecified is always true.","path":"scripts/blog_preflight.py","line":612,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/blog_preflight.py:612"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"scripts/blog_preflight.py","line":1490,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:scripts/blog_preflight.py:1490"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_global\" a function or an attribute? If it is a function, you may have meant literal.is_global() because literal.is_global is always true.","path":"scripts/blog_preflight.py","line":2880,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/blog_preflight.py:2880"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_loopback\" a function or an attribute? If it is a function, you may have meant literal.is_loopback() because literal.is_loopback is always true.","path":"scripts/blog_preflight.py","line":2880,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/blog_preflight.py:2880"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_multicast\" a function or an attribute? If it is a function, you may have meant literal.is_multicast() because literal.is_multicast is always true.","path":"scripts/blog_preflight.py","line":2880,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/blog_preflight.py:2880"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"scripts/blog_preflight.py","line":3124,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:scripts/blog_preflight.py:3124"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"scripts/discourse_research.py","line":732,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:scripts/discourse_research.py:732"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_global\" a function or an attribute? If it is a function, you may have meant addr.is_global() because addr.is_global is always true.","path":"scripts/generate_hero.py","line":165,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/generate_hero.py:165"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_loopback\" a function or an attribute? If it is a function, you may have meant addr.is_loopback() because addr.is_loopback is always true.","path":"scripts/generate_hero.py","line":167,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/generate_hero.py:167"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_link_local\" a function or an attribute? If it is a function, you may have meant addr.is_link_local() because addr.is_link_local is always true.","path":"scripts/generate_hero.py","line":168,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/generate_hero.py:168"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_multicast\" a function or an attribute? If it is a function, you may have meant addr.is_multicast() because addr.is_multicast is always true.","path":"scripts/generate_hero.py","line":169,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/generate_hero.py:169"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_unspecified\" a function or an attribute? If it is a function, you may have meant addr.is_unspecified() because addr.is_unspecified is always true.","path":"scripts/generate_hero.py","line":170,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/generate_hero.py:170"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"scripts/sync_flow.py","line":595,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:scripts/sync_flow.py:595"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":82,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:82"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":83,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:83"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":84,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:84"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":85,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:85"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":86,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:86"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":91,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:91"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":92,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:92"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":93,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:93"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":94,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:94"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":95,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:95"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":96,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:96"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/validate_skills.py","line":98,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/validate_skills.py:98"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"skills/blog-google/scripts/google_auth.py","line":263,"fingerprint":"python.requests.best-practice.use-raise-for-status:skills/blog-google/scripts/google_auth.py:263"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-google/scripts/google_auth.py","line":318,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-google/scripts/google_auth.py:318"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-google/scripts/google_auth.py","line":357,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-google/scripts/google_auth.py:357"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-google/scripts/google_auth.py","line":408,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-google/scripts/google_auth.py:408"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-google/scripts/google_auth.py","line":421,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-google/scripts/google_auth.py:421"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-google/scripts/google_auth.py","line":796,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-google/scripts/google_auth.py:796"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-google/scripts/google_auth.py","line":870,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-google/scripts/google_auth.py:870"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-google/scripts/google_report.py","line":817,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-google/scripts/google_report.py:817"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-google/scripts/keyword_planner.py","line":103,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-google/scripts/keyword_planner.py:103"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-google/scripts/keyword_planner.py","line":106,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-google/scripts/keyword_planner.py:106"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_global\" a function or an attribute? If it is a function, you may have meant addr.is_global() because addr.is_global is always true.","path":"skills/blog-google/scripts/nlp_analyze.py","line":233,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:skills/blog-google/scripts/nlp_analyze.py:233"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_multicast\" a function or an attribute? If it is a function, you may have meant addr.is_multicast() because addr.is_multicast is always true.","path":"skills/blog-google/scripts/nlp_analyze.py","line":234,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:skills/blog-google/scripts/nlp_analyze.py:234"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_unspecified\" a function or an attribute? If it is a function, you may have meant addr.is_unspecified() because addr.is_unspecified is always true.","path":"skills/blog-google/scripts/nlp_analyze.py","line":235,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:skills/blog-google/scripts/nlp_analyze.py:235"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_loopback\" a function or an attribute? If it is a function, you may have meant addr.is_loopback() because addr.is_loopback is always true.","path":"skills/blog-google/scripts/nlp_analyze.py","line":236,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:skills/blog-google/scripts/nlp_analyze.py:236"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_link_local\" a function or an attribute? If it is a function, you may have meant addr.is_link_local() because addr.is_link_local is always true.","path":"skills/blog-google/scripts/nlp_analyze.py","line":237,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:skills/blog-google/scripts/nlp_analyze.py:237"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-image/scripts/setup_image_mcp.py","line":69,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-image/scripts/setup_image_mcp.py:69"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-image/scripts/setup_image_mcp.py","line":104,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-image/scripts/setup_image_mcp.py:104"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-image/scripts/validate_image_setup.py","line":189,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-image/scripts/validate_image_setup.py:189"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-image/scripts/validate_image_setup.py","line":204,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-image/scripts/validate_image_setup.py:204"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_notebook_host_url\" a function or an attribute? If it is a function, you may have meant is_notebook_host_url.is_notebook_host_url() because is_notebook_host_url.is_notebook_host_url is always true.","path":"skills/blog-notebooklm/scripts/ask_question.py","line":94,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:skills/blog-notebooklm/scripts/ask_question.py:94"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-notebooklm/scripts/auth_manager.py","line":109,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-notebooklm/scripts/auth_manager.py:109"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_notebook_host_url\" a function or an attribute? If it is a function, you may have meant is_notebook_host_url.is_notebook_host_url() because is_notebook_host_url.is_notebook_host_url is always true.","path":"skills/blog-notebooklm/scripts/auth_manager.py","line":165,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:skills/blog-notebooklm/scripts/auth_manager.py:165"},{"rule_id":"opengrep/python.lang.correctness.use-sys-exit","severity":"medium","message":"Detected use of `exit`. Use `sys.exit` over the python shell `exit` built-in. `exit` is a helper for the interactive shell and may not be available on all Python implementations.","path":"skills/blog-notebooklm/scripts/auth_manager.py","line":373,"fingerprint":"python.lang.correctness.use-sys-exit:skills/blog-notebooklm/scripts/auth_manager.py:373"},{"rule_id":"opengrep/python.lang.correctness.use-sys-exit","severity":"medium","message":"Detected use of `exit`. Use `sys.exit` over the python shell `exit` built-in. `exit` is a helper for the interactive shell and may not be available on all Python implementations.","path":"skills/blog-notebooklm/scripts/auth_manager.py","line":416,"fingerprint":"python.lang.correctness.use-sys-exit:skills/blog-notebooklm/scripts/auth_manager.py:416"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-notebooklm/scripts/browser_utils.py","line":96,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-notebooklm/scripts/browser_utils.py:96"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"skills/blog-notebooklm/scripts/notebook_manager.py","line":42,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:skills/blog-notebooklm/scripts/notebook_manager.py:42"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":1.0,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":0.0,"check:tests_cochange":1.0,"test_lines":21770.0,"source_lines":30535.0,"test_ratio":0.713,"ci_files":2.0,"cochange_share":0.5882,"cochange_commits":85.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/google-currentness.yml","ref":".github/workflows/google-currentness.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (pytest)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["pytest"],"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":1.0,"check:changelog":1.0,"readme_lines":283.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","url":null,"weight":0.0},{"kind":"docs","description":".github/CONTRIBUTING.md","ref":".github/CONTRIBUTING.md","url":null,"weight":0.0},{"kind":"docs","description":"CHANGELOG.md","ref":"CHANGELOG.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":0.0,"check:low_escape_density":0.0,"escapes":239.0,"escapes_per_kloc":8.288},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":25078.0,"other_lines":5457.0,"files_blamed":66.0,"blame_failures":0.0,"quality:ai_findings":52.0,"quality:ai_per_kloc":2.074,"quality:other_findings":14.0,"quality:other_per_kloc":2.566,"quality:ratio":0.81,"security:ai_findings":17.0,"security:ai_per_kloc":0.678,"security:other_findings":3.0,"security:other_per_kloc":0.55,"security:ratio":1.23},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":true},"error":null}],"flags":[]}