{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:00.861175Z","repo":{"ref":{"host":"github.com","owner":"LeadGrowGTM","name":"research-process-builder"},"default_branch":"master","clone_url":"https://github.com/LeadGrowGTM/research-process-builder.git","html_url":"https://github.com/LeadGrowGTM/research-process-builder","description":"Build validated web research processes through self-annealing loops. 138 patterns tested, 90%+ accuracy. Works with Claude Code, Clay, any AI agent.","stars":70,"forks":19,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":6204,"primary_language":"Python","license_spdx":"MIT","created_at":"2026-03-05T15:12:31Z","pushed_at":"2026-10-06T16:57:01Z","security_policy_url":null,"distribution":{"owner_created_at":"2025-12-24T18:48:17Z","owner_type":"Organization","release_assets":[]}},"commit_sha":"2b49aac264ac3305ce1a7fc1c6663c58189baa06","profile":{"lines_by_language":{"Python":58591,"TypeScript":19830,"JavaScript":953,"SQL":409},"files_by_category":{"config":413,"docs":232,"source":229,"test":128,"other":7,"oversized":4,"generated":1},"source_lines":50553,"test_lines":29230},"pillars":{"ai_provenance":{"score":66.1,"confidence":0.95,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.6612,"suspected_share":0.2644,"estimated_share":0.6612,"ai_artifacts":6.0,"flagged_work_units":13.0,"flagged_releases":null,"style_index":0.257},"summary":"Explicit AI attribution on 66% of first-party code added; an estimated 66% including velocity signals."},"quality":{"score":55.2,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":39.1,"duplication":69.9,"lint":68.7,"testing":55.0,"docs":65.0,"type_safety":15.4,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.58, no CI test run detected; 31% of function code in complex or long functions; 6% duplicated lines. Weakest area: type safety."},"security":{"score":62.4,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":81.9,"sast":89.0,"dependencies":42.7,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 0 possible secret(s) in the tree, 1 only in history; 14 known vulnerabilities in 7 dependencies; 10 high-severity SAST findings. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"ok","tool_version":null,"metrics":{"declared":9.0,"checked":9.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":289.0,"attributed_commits":149.0,"attributed_commit_share":0.5155709342560554,"effective_loc":90210.0,"attributed_loc":59648.0,"attributed_loc_share":0.6612127258618778,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 149 attributed commits, 59,648 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"2b49aac264ac3305ce1a7fc1c6663c58189baa06","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/2b49aac264ac3305ce1a7fc1c6663c58189baa06","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"ce955eb75814ff423e0404a31a0b6da5885e8205","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/ce955eb75814ff423e0404a31a0b6da5885e8205","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"91174c86190739d7cc901577fe5f22b89f269463","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/91174c86190739d7cc901577fe5f22b89f269463","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"7edb899fbf3dbcbad9142664108344a04612db61","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/7edb899fbf3dbcbad9142664108344a04612db61","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"4bc907f7013f8683a4626e7697e1cfeced78dfa2","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/4bc907f7013f8683a4626e7697e1cfeced78dfa2","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"e3cf840b2800894634e8a8f507a896fa981505d4","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/e3cf840b2800894634e8a8f507a896fa981505d4","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"f17ca94408870b66d1cd6dc8f01181825e608186","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/f17ca94408870b66d1cd6dc8f01181825e608186","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"401535682a3119ade4cfcec73a8ee2d5f980d2d9","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/401535682a3119ade4cfcec73a8ee2d5f980d2d9","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"63adb71fe5ad6ffdcfa3276dc3ef37b4d15e2a82","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/63adb71fe5ad6ffdcfa3276dc3ef37b4d15e2a82","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"b19fef4dcab2d1e003a0209898f9ffae8bca0719","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/b19fef4dcab2d1e003a0209898f9ffae8bca0719","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"fc3f7562af779fd1f4274a4616561258fcf19da5","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/fc3f7562af779fd1f4274a4616561258fcf19da5","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"6ec5e22e9fc30d1dfcf98b47084980a9830c8145","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/6ec5e22e9fc30d1dfcf98b47084980a9830c8145","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"655427b13926ccca46737555f745d929b8265905","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/655427b13926ccca46737555f745d929b8265905","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: PR description attribution","ref":"90a4404c603403ee224515d7300bc8591b518857","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/90a4404c603403ee224515d7300bc8591b518857","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"7d48c3987b13e88128267dca68cb1faaeb0cca9c","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/7d48c3987b13e88128267dca68cb1faaeb0cca9c","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"2b8ab3471d8c414bd7dab7cd7fe6de53cd2d026f","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/2b8ab3471d8c414bd7dab7cd7fe6de53cd2d026f","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"ca3401e7ea3a77407c153393ec8d9b4203368ad1","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/ca3401e7ea3a77407c153393ec8d9b4203368ad1","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"ceabebc03c57d6cd75030976abef3ca787fb2925","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/ceabebc03c57d6cd75030976abef3ca787fb2925","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"3e6e62582d8aa125e8f82af86702c07648b431e3","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/3e6e62582d8aa125e8f82af86702c07648b431e3","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"6ad27189a073b7aacda91a8d203609a4a0511fea","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/6ad27189a073b7aacda91a8d203609a4a0511fea","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"302cbba99ddd04e0c751a4a0eada1570ec22a7ed","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/302cbba99ddd04e0c751a4a0eada1570ec22a7ed","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"22219b6d7cb94b1ad96e42895bd7ab1dc31b6d8f","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/22219b6d7cb94b1ad96e42895bd7ab1dc31b6d8f","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"110a4aa83fc65ec348591ca6cf706acffecb998f","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/110a4aa83fc65ec348591ca6cf706acffecb998f","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"ad5e59ebdf026ee1301ecf34b75abd8c236a4b01","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/ad5e59ebdf026ee1301ecf34b75abd8c236a4b01","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"f23cd1442c0ad314238223b2374420f2e3cf2b17","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/f23cd1442c0ad314238223b2374420f2e3cf2b17","weight":0.9}],"data":{"attributed_loc_by_commit":{"cdc20fd82a06b276b897eca251fb41cc577ca64a":0,"e94b0d49d44c27cb32413e8e813ff791a63b82e4":0,"0206de0aac8a858672c2c7b9acbe4d502b6952f7":0,"610b754a78175233727752de4ea14677084c01d1":0,"2ff65aecc961f9cb152f4f17272aaf32464856a1":0,"4de13a5128c073ac7cd6341d183361d3cddbb1bd":0,"b964235683fad90cf45ec7cfe255ab356973dd04":0,"73a6c737c3c518e8493d32180b62957244355f6f":0,"ab7d8ff0e44244a2b815fa432cc2663f5bb22172":0,"03e795acfa23e746ac0910f314414034b60297f2":0,"272563b89e2dbf66f207facd33126a7c921907fe":0,"36f513cafb97959e79f0e55f3b1f7efdfebacac0":0,"cd41b6e93cdb2911ac3cae228f1cd9ff15efba7c":0,"f257b15a2ae29f39ad32340e198eb1934c75aa61":0,"6aafd7949c640f12141240b96886ebf5bf4af146":537,"6cb9d5276edc47bc96869e370034f82fb5d4e248":0,"234c22790923a0d2d515bedd45a24575d05d50fe":23,"71d97ab382f03844bb1554099909a60231298c4b":211,"6810fa8b01590daa9258ba7a56b7fe52f7db606e":560,"7dc69b6491c3001d4fde5dd3dd963b6a43e10486":432,"9c8e2c046cac32085aef5d4563edffbf06653039":388,"f69c665278529d69ef3119872ecb3740fda7c7db":2392,"7aae6f2309ff68f16a25d1248cc5aa1abcb3d17b":0,"a1c48af897865b613a6bee3bd7694940f8c320fb":0,"7aa179ff5062418508b8fa2e3dd494e013395a23":1322,"4921d42502217bd26e41a206d016f7dacef71c88":0,"823ae7223888e797858b15cb7b0a5529395f27bf":1796,"c87668e6d5f1c6d63b09a0bdfc0c129252775e9e":634,"e23af490652158ba231b43f32d3ac963167eda9f":45,"1ee93067d20f76c9c3ca40d7121b10ac09f927d0":1048,"2b17b811f38fef926687598daf771b661dd05e32":0,"adeeab61da49d74b3cd1f82608ae576772c6bc39":0,"285d5427ab1c2dc0335fdf27ca0a8b8da90365c3":3481,"01a3f5d7321b5970076fd75ff9618d555edc954d":141,"669447212835148f33b51de48fed6dc359a9c1c0":16,"e9c58154ebcd7b4148be9ca8025b670b71524b27":1489,"31c0440ff33fa63d970a09e163c70221c4375829":0,"c5913923441799823286c5883326793ee2aad3b9":0,"520f8e022542c04bd992b8d0d81951cc497230f7":334,"314276ac9bf2774626778e8f7cb1e778523b24c0":0,"8cd200a131e27ec4255242bdc3ce6a5d171cf231":551,"00cd70e5b8f03f4c2e3536d22a5e94882787a56b":23,"83a93593d838b072ff0bfb4fc2625a8c74987df8":0,"e47a7400d733a5bf480ada4db1c2cf4aa0930528":1169,"5935947e42e3fa17a4743c543b61c09531159cf5":0,"a181137491b0be8cec9578b62d641818909e1bf0":158,"0d7d4e9dc0e00be1f6f90537137b88c61eff7f1a":141,"3e8dda36ccc81bc37c6a1f1c7cdb1154f439a3c1":14,"8b77018ebb89deed9e77f626f69b1618a871b29e":2,"904c8e43eb6a1b3cfea3ff7db0eef806f513f0ec":19,"58e7eb90bac009834af8ef22ad9508c1b357ff42":82,"d2db499bf1fd138cb9328219ee5898a602fee772":0,"b07f6386580920a8b93f5c4be4b77d3a00d83b21":72,"85e4220c66ad4b10ff4374f6855edbcb6011b356":363,"139c8882f7c2aaedc99453def878ea9ace46839b":427,"32c8dbccd9600e277eda2e51ee4f91e059d64985":73,"7c1924bfd55fd231a7bd90c57e2fcc77b34452bb":6,"e681da286f54a913d817313729e3d12fcd296747":1026,"0d8a38ccbb3690f6e2d1ad77b226faae5b692276":288,"01da6bc987c0772f284acde8aebfc2961719327a":137,"0972063796e84127900a4b3cb8150c5893d7fcaf":2,"6d747f6fd0a97f5ec1fb425daa6f8d949efb29b0":0,"3a6dbf2d881e9c9a862bda428a675502f06b03a0":6157,"a280b31411a90cc6426c06b8953efed7d9290aec":459,"3213c9d7c3cf2fd5052d240194d44f43cf368e29":324,"bff56ff0db88336616acef9b7df2c1e7cf00822a":175,"a8f77e0350ca9f11734289ccb0d615a7599337ef":18,"a5f05adec4c4141fc23f6dd795dc66a1c59f6c94":219,"7c1b7a0978e8e5820fae5fbaf54b6dc1c4883aa4":74,"e75842405eec99d8f209f03fc0c9dd203898b24c":116,"397909086dd0bf5faafce1f57b270eac2fce4ff4":0,"50f23e8ba2a6aa9e37d6972822a9c76fc904efe4":631,"28ad4fe02e07026f09e44cf0b5b3532455154755":2147,"07e9a2f6679a6b3908a7fdc61c3a674e4325212d":18,"950b0d94be20c34cf4cf0d33bd4b9333940283ce":79,"56be8f2b8d3154f8255b2ee0b62a0886afb78f72":73,"8ce6f83381124f3a8a4203de24ec7d50e72bf076":14,"a3da9ea5f1d7cb48e7f7e2eefc45af57b573e6db":0,"4d71b1a1e520419bf09c7297a3bbec873040cb4d":269,"82f804a911906f6ee05a0496834af3cbd643e04e":0,"a0541b444e7915ce01d63dced46740ff28b54b48":0,"6870ab678ae0a258d1d6e86df24b5b48f3b0447c":195,"2bf0310a6222cf891ec445d7f6e2df57242fe9b2":371,"a9f0278c9d9c5525f9b313b355f26dd488bd5618":13,"3939ba20c8af767917fb441ee3022a274c892c3e":2994,"5184b3c09267d4283ac833997a45b460b021ecb0":1457,"111fdc7d0c0da8e58fd00cf2b63913c96da094c7":3562,"e3ed944a9ca51501cd038acc2d7dbcf1589811fe":115,"4b69a4932a6a015c2b5f8d4649941837e279aa41":141,"691a0f10b7d3964bd9d2e35d7868cb6d463e4feb":0,"fd9ca9f0f170a9531f80234491d3fb6e9274ec54":632,"83431b1b7b1d746382512df446667047766db6d7":156,"b33954990a707942b503dea54abaf5d03e23ed07":34,"c1f5142c4424cce9d8fb5405928cc37c76224723":18,"bd1760990f1310d3618e6bc9498d39d4bd2e64b0":71,"9986bf4153c60b52e0839198027df281282b8a33":0,"a8be81ec65ac9fd16e359c740697ee58b9ddac31":967,"0f6b52722590b4721554ef1de73ab90855b3ba0d":9,"142e25d05a290dd12a9bbd9811e5db9fdb8b8a16":25,"aea73168b22c6fd5c354b8ba84f225169b957cc9":0,"daf60b308d42c43755ea8fe6a8cbb51b105cbb4b":75,"df8f3b17d3dcf2fd385fde03375a0a497441a45b":0,"ae5b71be6e84bf92a56066a2361fc6c8316ddd7c":117,"88449bedf88dff9113bd3f94959d82420ffd1e92":0,"db1d8a93d83d9040724dbe9263c43cd2afe3b168":831,"ac00b6a5c80496c81d770fa51ba6df7869a4174f":82,"6525dc3f8cb49b8aeb2f7cfd083c5f760cce391b":0,"18bba700246b7a01faa786bb724ee69feaca6f94":4,"5554c6a99709b8a6148fbacdad707c43fa9fd365":0,"54a3da35da97d506ea0de6ce0f9beb150622750b":5,"70c9f8394a9ae54d54311d87ddd7c9522f1c3ffc":0,"368e609ef4d62ee5d7586af575a88d94b656effd":0,"a2c0675b14e262024d8b699178ef6d5383ab503d":0,"529e4bd0b21ffd4e91c7bad8f3bef0f02711be43":0,"3925082c25a19403dae1bfc191b6b36112e1ebe0":579,"955c66966c262d4df23f9e18c9621b7efc6284ac":0,"4f93266034fc9bae05459d7065f8bb7c41d7c4b2":388,"cba68983415b5f03314e5f3860f0db7dd644f68c":173,"e10607f28bc315a6c18bc458977161974c613082":3,"e69aa3e8406af75d9d3ed2439a761fbaceb4f3ee":32,"57480615825056b04a60036d5dce77ce53393751":0,"9e3a85dbba4ef62233a2440c751ce1829062e7fe":796,"cca5fff023e6a60ec6e4d0af54b218828e2f3085":0,"f7fe170ebc79dd669c99a2b0b03fd11e3449e814":0,"f23cd1442c0ad314238223b2374420f2e3cf2b17":0,"ad5e59ebdf026ee1301ecf34b75abd8c236a4b01":1482,"110a4aa83fc65ec348591ca6cf706acffecb998f":17,"22219b6d7cb94b1ad96e42895bd7ab1dc31b6d8f":0,"302cbba99ddd04e0c751a4a0eada1570ec22a7ed":0,"6ad27189a073b7aacda91a8d203609a4a0511fea":30,"3e6e62582d8aa125e8f82af86702c07648b431e3":5,"ceabebc03c57d6cd75030976abef3ca787fb2925":0,"ca3401e7ea3a77407c153393ec8d9b4203368ad1":33,"2b8ab3471d8c414bd7dab7cd7fe6de53cd2d026f":94,"7d48c3987b13e88128267dca68cb1faaeb0cca9c":8358,"90a4404c603403ee224515d7300bc8591b518857":28,"655427b13926ccca46737555f745d929b8265905":465,"6ec5e22e9fc30d1dfcf98b47084980a9830c8145":166,"fc3f7562af779fd1f4274a4616561258fcf19da5":3388,"b19fef4dcab2d1e003a0209898f9ffae8bca0719":7,"63adb71fe5ad6ffdcfa3276dc3ef37b4d15e2a82":120,"401535682a3119ade4cfcec73a8ee2d5f980d2d9":99,"f17ca94408870b66d1cd6dc8f01181825e608186":939,"e3cf840b2800894634e8a8f507a896fa981505d4":311,"4bc907f7013f8683a4626e7697e1cfeced78dfa2":1,"7edb899fbf3dbcbad9142664108344a04612db61":20,"91174c86190739d7cc901577fe5f22b89f269463":32,"ce955eb75814ff423e0404a31a0b6da5885e8205":3,"2b49aac264ac3305ce1a7fc1c6663c58189baa06":30},"tools":{"claude-code":{"name":"Claude Code","commits":149,"loc":59648,"first_seen":1772723545,"last_seen":1791305821}},"monthly":{"2026-03":{"loc":4543,"attributed_loc":4543},"2026-04":{"loc":17021,"attributed_loc":14432},"2026-05":{"loc":9034,"attributed_loc":7969},"2026-06":{"loc":3810,"attributed_loc":3810},"2026-08":{"loc":35870,"attributed_loc":12470},"2026-09":{"loc":5833,"attributed_loc":2325},"2026-10":{"loc":14099,"attributed_loc":14099}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":6.0,"workflow_agents":0.0,"tools_configured":2.0,"earliest_adoption":1778338295.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":".claude/rules/data-safety.md (claude-code configuration)","ref":".claude/rules/data-safety.md","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/.claude/rules/data-safety.md","weight":0.5},{"kind":"ai-artifact","description":".claude/rules/pipeline-safety.md (claude-code configuration)","ref":".claude/rules/pipeline-safety.md","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/.claude/rules/pipeline-safety.md","weight":0.5},{"kind":"ai-artifact","description":".claude/rules/script-conventions.md (claude-code configuration)","ref":".claude/rules/script-conventions.md","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/.claude/rules/script-conventions.md","weight":0.5},{"kind":"ai-artifact","description":".claude/settings.json (claude-code configuration)","ref":".claude/settings.json","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/.claude/settings.json","weight":0.5},{"kind":"ai-artifact","description":"CLAUDE.md (claude-code configuration)","ref":"CLAUDE.md","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/CLAUDE.md","weight":0.5},{"kind":"ai-artifact","description":"AGENTS.md (generic-agent configuration)","ref":"AGENTS.md","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/AGENTS.md","weight":0.5}],"data":{"artifacts":[{"tool":"claude-code","path":".claude/rules/data-safety.md","added_at":1782138499},{"tool":"claude-code","path":".claude/rules/pipeline-safety.md","added_at":1782086162},{"tool":"claude-code","path":".claude/rules/script-conventions.md","added_at":1782138499},{"tool":"claude-code","path":".claude/settings.json","added_at":1782086162},{"tool":"claude-code","path":"CLAUDE.md","added_at":1778338295},{"tool":"generic-agent","path":"AGENTS.md","added_at":1786548303}],"workflows":[],"tools":["claude-code","generic-agent"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":88.0,"flagged_units":13.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":75695.0,"flagged_loc":42318.0,"flagged_loc_share":0.5590593830503996,"max_loc_per_hour":10548.233597692863,"median_loc_per_hour":302.39687799773264,"pr_timed_units":20.0,"excluded_import_loc":14515.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"8,128 lines of first-party code in ~0.8h (10,548 lines/hour, 4 commit session)","ref":"e3ed944a9ca51501cd038acc2d7dbcf1589811fe","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/e3ed944a9ca51501cd038acc2d7dbcf1589811fe","weight":0.6},{"kind":"velocity-burst","description":"3,679 lines of first-party code in ~0.5h (7,358 lines/hour, 2 commit session)","ref":"f15a9fc67f81f6549e1fbc03d55bc99d4e92c94d","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/f15a9fc67f81f6549e1fbc03d55bc99d4e92c94d","weight":0.6},{"kind":"velocity-burst","description":"2,840 lines of first-party code in ~0.5h (5,680 lines/hour, 1 commit session)","ref":"b8bb6c29c0e89b63ffccd354c6b38dead2bd5c71","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/b8bb6c29c0e89b63ffccd354c6b38dead2bd5c71","weight":0.6},{"kind":"velocity-burst","description":"1,711 lines of first-party code in ~0.5h (3,422 lines/hour, 1 commit session)","ref":"6df87ee5eb19cb99cbe27e615ab2bd09549b803e","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/6df87ee5eb19cb99cbe27e615ab2bd09549b803e","weight":0.6},{"kind":"velocity-burst","description":"3,677 lines of first-party code in ~1.1h (3,385 lines/hour, 9 commit session)","ref":"c0ea6a0bf9fbdd4ccc214891505cc6c8185e135e","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/c0ea6a0bf9fbdd4ccc214891505cc6c8185e135e","weight":0.6},{"kind":"velocity-burst","description":"3,118 lines of first-party code in ~1.5h (2,101 lines/hour, 8 commit session)","ref":"bf07d155c58355b365d9745d09f1ac6caedde415","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/bf07d155c58355b365d9745d09f1ac6caedde415","weight":0.6},{"kind":"velocity-burst","description":"1,076 lines of first-party code in ~0.7h (1,586 lines/hour, 4 commit session)","ref":"daf60b308d42c43755ea8fe6a8cbb51b105cbb4b","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/daf60b308d42c43755ea8fe6a8cbb51b105cbb4b","weight":0.4756774457634056},{"kind":"velocity-burst","description":"5,972 lines of first-party code in ~4.9h (1,216 lines/hour, 26 commit session)","ref":"5f6310239f4a98494215bde16228a529ac1fe12a","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/5f6310239f4a98494215bde16228a529ac1fe12a","weight":0.36486734174350843},{"kind":"velocity-burst","description":"1,169 lines of first-party code in ~1.0h (1,123 lines/hour, 5 commit session)","ref":"869fff67ffa3718637292c1b5a69e5111f697972","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/869fff67ffa3718637292c1b5a69e5111f697972","weight":0.33703150026695144},{"kind":"velocity-burst","description":"1,687 lines of first-party code in ~1.5h (1,120 lines/hour, 6 commit session)","ref":"c319fadb8e93561f517b232a1c14fcce2b1487be","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/c319fadb8e93561f517b232a1c14fcce2b1487be","weight":0.33596902083717495},{"kind":"velocity-burst","description":"3,388 lines of first-party code in ~3.1h (1,084 lines/hour, PR #29)","ref":"fc3f7562af779fd1f4274a4616561258fcf19da5","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/fc3f7562af779fd1f4274a4616561258fcf19da5","weight":0.32530583214793746},{"kind":"velocity-burst","description":"3,481 lines of first-party code in ~4.0h (870 lines/hour, 1 commit session)","ref":"285d5427ab1c2dc0335fdf27ca0a8b8da90365c3","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/285d5427ab1c2dc0335fdf27ca0a8b8da90365c3","weight":0.261075},{"kind":"velocity-burst","description":"2,392 lines of first-party code in ~4.0h (598 lines/hour, 1 commit session)","ref":"f69c665278529d69ef3119872ecb3740fda7c7db","url":"https://github.com/LeadGrowGTM/research-process-builder/commit/f69c665278529d69ef3119872ecb3740fda7c7db","weight":0.17939999999999998}],"data":{"flagged_loc_by_commit":{"f69c665278529d69ef3119872ecb3740fda7c7db":2392,"285d5427ab1c2dc0335fdf27ca0a8b8da90365c3":3481,"88be1585c55af61411490783a327f50c81f1ba8f":375,"685379467e8659b288a1315072788c7e94a7748e":131,"def8588ae8ed9c3755f3b785d0620485c2301da2":58,"27872354283d1a4b091a4961c99615724b93bd84":27,"0a2d9f734014057b6cf2d699921f719210ffaebb":103,"7cd455f958abccdf7e10f51ae0b8e2940076d507":138,"d7e5222fceb903974a019251f156e54180b6afc6":183,"d03da555cd4e60016479ecd9c2f014374495a38e":82,"27e13a3e6c48d1fa40ffa3e15811c49d90a7656e":41,"00d20e05da6f92f078efa1759b8025565b8e4479":892,"3e49eb8d2b6e5def815e2e4f883fab77cd0cf5b2":241,"5059ac72703bdcffbc03af50d444deeca27c3446":580,"8f663778838872ac495654b933747da9f4a7dc27":201,"93caa2b296699ded8245ed14b62a1916425a0a56":60,"f9228ea77523e6688f9af8d8ff5556e450a017b4":67,"f0abf2d1a3cab34503536846aea7608dd3a769b9":172,"40ebd646c74352e12abde314ad82b6983fe068cf":597,"07cf2335efe2b081ddf48d90b7cf3261cac2cbdf":152,"251ca7d067683ece736e70d60fb393e422ccbac4":9,"695b0371d64b6484135e988e5010fb80e95add6a":13,"ea1aca5f749aef13e090e4c58fb9964dd279e3c5":45,"56121d5005802037636ef7df2839f1c911fc59ed":40,"b48489a35b60d9504add4dbe9ada405f61c7db24":44,"c6a6528ff2b32063586825631ce2a28676b980ee":1606,"3dfcc23392caf9d0fdb48660caa7e8f8c6a2ea13":112,"5f6310239f4a98494215bde16228a529ac1fe12a":3,"c61e7475fac5d275a414faa0bdd095e21c406dc2":321,"94412919b78f565b168f43fed4b6b69fa1afcd2b":593,"62f52fc6a569fc0ff6a8dfbda567473488b132f1":536,"65fdb8f5ff46c17315f4104cb1240c647859c316":548,"a4db55b7471fba1198ddebbe291690d7231cf7c4":344,"88e23cee2d399725e1285304280db8049722e7c7":750,"c48be4d1a7e3258c3d31ca9a080da691665ae43a":344,"9a8a30adccdb716340fb8bb13997c53a0028a517":125,"c0ea6a0bf9fbdd4ccc214891505cc6c8185e135e":116,"af604c2aa0e3568957230b15104cf44c68067c7f":414,"87a8957e21a16ceee7dc47005de278592631913b":208,"244f08a9aa7166795d8bb8f01bdd2268b1aa0a16":29,"6e14b04005dbf5f111bbd9705d4cca08910f4794":900,"d96f6c4e5f846ef84a1c3637a3321af61610d5df":236,"6e1c58da1597a7bd0e565a988e8b494467422f1a":74,"0e4139b0ed74707f2f9590b2c7cac6111911517d":426,"bf07d155c58355b365d9745d09f1ac6caedde415":831,"b8bb6c29c0e89b63ffccd354c6b38dead2bd5c71":2840,"757848311c0b62779936f28c9d3521b938010e4a":3455,"f15a9fc67f81f6549e1fbc03d55bc99d4e92c94d":224,"6df87ee5eb19cb99cbe27e615ab2bd09549b803e":1711,"0439a444a4a6bbb17a50c43d38dd0933cb79d724":204,"20f5e8a82efd5e1ce21bd21930b79a05a9bb0c07":103,"062515a38c5712856b7427b7da620c6afac7e652":509,"a0df097a72a01a1741cdb1c2215d9a47236568a4":425,"300982224466d1d0e3ca863ff02a4c11fd5c25ef":414,"c319fadb8e93561f517b232a1c14fcce2b1487be":32,"3939ba20c8af767917fb441ee3022a274c892c3e":2994,"5184b3c09267d4283ac833997a45b460b021ecb0":1457,"111fdc7d0c0da8e58fd00cf2b63913c96da094c7":3562,"e3ed944a9ca51501cd038acc2d7dbcf1589811fe":115,"a8be81ec65ac9fd16e359c740697ee58b9ddac31":967,"0f6b52722590b4721554ef1de73ab90855b3ba0d":9,"142e25d05a290dd12a9bbd9811e5db9fdb8b8a16":25,"daf60b308d42c43755ea8fe6a8cbb51b105cbb4b":75,"2fdc6691cf3a6f97e6887e7d6d5e53db4c3bb483":135,"146e4770c228b99eecf0667d62c35d39ce49f9f0":122,"f02c83a43f0e760052c186d3f9b52885779a5e95":188,"814643dba7c3460a09e316f37e5c392fb2a0a393":209,"869fff67ffa3718637292c1b5a69e5111f697972":515,"fc3f7562af779fd1f4274a4616561258fcf19da5":3388},"excluded_import_commits":["3a6dbf2d881e9c9a862bda428a675502f06b03a0","7d48c3987b13e88128267dca68cb1faaeb0cca9c"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":50553.0,"index":0.257,"count:narrated_steps":4.0,"per_kloc:narrated_steps":0.079,"files:narrated_steps":1.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":18.0,"per_kloc:emoji_in_code":0.356,"files:emoji_in_code":4.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 1: SerperDev search","ref":"scripts/agent_research.py:228","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/agent_research.py#L228","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 2: FireCrawl scrape top URLs","ref":"scripts/agent_research.py:243","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/agent_research.py#L243","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 3: Combine content and extract","ref":"scripts/agent_research.py:255","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/agent_research.py#L255","weight":0.0},{"kind":"stylometry:narrated_steps","description":"step-by-step narration comment: # Step 4: GT validation (if ground truth exists)","ref":"scripts/agent_research.py:274","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/agent_research.py#L274","weight":0.0}],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":1.0,"secrets_nonprod":1.0,"secrets_low_confidence":0.0},"findings":[{"rule_id":"gitleaks/curl-auth-header","severity":"low","message":"Possible curl-auth-header secret in the current tree (test/docs/example file)","path":"trigger/README.md","line":350,"fingerprint":"trigger/README.md:curl-auth-header:350"},{"rule_id":"gitleaks/sourcegraph-access-token","severity":"medium","message":"Possible sourcegraph-access-token secret in history (commit 9c8e2c046c); removed from the current tree but still retrievable","path":"searches/raw-results-master.json","line":57854,"fingerprint":"9c8e2c046cac32085aef5d4563edffbf06653039:searches/raw-results-master.json:sourcegraph-access-token:57854"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":44.0,"findings_high":10.0,"findings_medium":30.0,"findings_low":4.0,"weighted_findings":16.65,"scanned_lines":50144.0,"parse_errors":2.0},"findings":[{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'call' 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":"enrichments/news-product-launches/run.py","line":174,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:enrichments/news-product-launches/run.py:174"},{"rule_id":"opengrep/python.sqlalchemy.security.sqlalchemy-execute-raw-query","severity":"high","message":"Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition [confidence low]","path":"scripts/company_enrichment/adapters/meta_ads.py","line":108,"fingerprint":"python.sqlalchemy.security.sqlalchemy-execute-raw-query:scripts/company_enrichment/adapters/meta_ads.py:108"},{"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/company_enrichment/cli.py","line":21,"fingerprint":"python.lang.security.use-defused-xml:scripts/company_enrichment/cli.py:21"},{"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/company_enrichment/cli.py","line":419,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:scripts/company_enrichment/cli.py:419"},{"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/game_signals_extract.py","line":277,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:scripts/game_signals_extract.py:277"},{"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":"scripts/game_signals_extract.py","line":278,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-tainted-env-args:scripts/game_signals_extract.py:278"},{"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/motorica_append_linkedin_to_sheet.py","line":32,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:scripts/motorica_append_linkedin_to_sheet.py:32"},{"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/motorica_collect_copy_e1.py","line":48,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:scripts/motorica_collect_copy_e1.py:48"},{"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/motorica_collect_copy_e2.py","line":63,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:scripts/motorica_collect_copy_e2.py:63"},{"rule_id":"opengrep/javascript.lang.security.audit.spawn-shell-true","severity":"high","message":"Found '$SPAWN' with '{shell: true}'. This is dangerous because this call will spawn the command using a shell process. Doing so propagates current shell settings and variables, which makes it much easier for a malicious actor to execute commands. Use '{shell: false}' instead. [confidence low]","path":"trigger/run-dev.mjs","line":9,"fingerprint":"javascript.lang.security.audit.spawn-shell-true:trigger/run-dev.mjs:9"},{"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/backfill_article_text.py","line":45,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/backfill_article_text.py:45"},{"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/backfill_article_text.py","line":62,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/backfill_article_text.py:62"},{"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/backfill_article_text.py","line":79,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/backfill_article_text.py:79"},{"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/backfill_article_text.py","line":96,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/backfill_article_text.py:96"},{"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/company_enrichment/adapters/google_ads.py","line":142,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/company_enrichment/adapters/google_ads.py:142"},{"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/company_enrichment/adapters/meta_ads.py","line":377,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/company_enrichment/adapters/meta_ads.py:377"},{"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/company_enrichment/adapters/meta_ads.py","line":393,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/company_enrichment/adapters/meta_ads.py:393"},{"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/company_enrichment/adapters/parallel.py","line":214,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/company_enrichment/adapters/parallel.py:214"},{"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/company_enrichment/adapters/parallel_task.py","line":276,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/company_enrichment/adapters/parallel_task.py:276"},{"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/company_enrichment/adapters/serper.py","line":154,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/company_enrichment/adapters/serper.py:154"},{"rule_id":"opengrep/python.django.security.injection.tainted-url-host","severity":"medium","message":"User data flows into the host portion of this manually-constructed URL. This could allow an attacker to send data to their own server, potentially exposing sensitive data such as cookies or authorization information sent with this request. They could also probe internal servers or other resources th [confidence low]","path":"scripts/company_enrichment/ads_collect.py","line":81,"fingerprint":"python.django.security.injection.tainted-url-host:scripts/company_enrichment/ads_collect.py:81"},{"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/company_enrichment/cli.py","line":370,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/company_enrichment/cli.py:370"},{"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/company_enrichment/cli.py","line":485,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/company_enrichment/cli.py:485"},{"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/company_enrichment/page_signals.py","line":129,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/company_enrichment/page_signals.py:129"},{"rule_id":"opengrep/python.django.security.injection.tainted-url-host","severity":"medium","message":"User data flows into the host portion of this manually-constructed URL. This could allow an attacker to send data to their own server, potentially exposing sensitive data such as cookies or authorization information sent with this request. They could also probe internal servers or other resources th [confidence low]","path":"scripts/company_enrichment/runner.py","line":136,"fingerprint":"python.django.security.injection.tainted-url-host:scripts/company_enrichment/runner.py:136"},{"rule_id":"opengrep/python.django.security.injection.tainted-url-host","severity":"medium","message":"User data flows into the host portion of this manually-constructed URL. This could allow an attacker to send data to their own server, potentially exposing sensitive data such as cookies or authorization information sent with this request. They could also probe internal servers or other resources th [confidence low]","path":"scripts/company_enrichment/signal_collection.py","line":474,"fingerprint":"python.django.security.injection.tainted-url-host:scripts/company_enrichment/signal_collection.py:474"},{"rule_id":"opengrep/python.lang.security.insecure-hash-algorithm-md5","severity":"medium","message":"Detected MD5 hash algorithm which is considered insecure. MD5 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead. [confidence medium]","path":"scripts/pattern_tester.py","line":240,"fingerprint":"python.lang.security.insecure-hash-algorithm-md5:scripts/pattern_tester.py:240"},{"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/product_launch_ph_pipeline.py","line":66,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:scripts/product_launch_ph_pipeline.py:66"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-redos","severity":"medium","message":"Detected the use of a regular expression `^(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$` which appears to be vulnerable to a Regular expression Denial-of-Service (ReDoS). For this reason, it is recommended to review the regex and ensure it is not vulnerable to catastrophic backtracking, and if p [confidence low]","path":"trigger/src/pipeline/additional-signals.ts","line":123,"fingerprint":"javascript.lang.security.audit.detect-redos:trigger/src/pipeline/additional-signals.ts:123"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-regexp","severity":"medium","message":"RegExp() called with a `phrase` function argument, this might allow an attacker to cause a Regular Expression Denial-of-Service (ReDoS) within your application as RegExP blocks the main thread. For this reason, it is recommended to use hardcoded regexes instead. If your regex is run on user-controll [confidence low]","path":"trigger/src/pipeline/brave-source.ts","line":33,"fingerprint":"javascript.lang.security.audit.detect-non-literal-regexp:trigger/src/pipeline/brave-source.ts:33"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-regexp","severity":"medium","message":"RegExp() called with a `domain` function argument, this might allow an attacker to cause a Regular Expression Denial-of-Service (ReDoS) within your application as RegExP blocks the main thread. For this reason, it is recommended to use hardcoded regexes instead. If your regex is run on user-controll [confidence low]","path":"trigger/src/pipeline/brave-source.ts","line":47,"fingerprint":"javascript.lang.security.audit.detect-non-literal-regexp:trigger/src/pipeline/brave-source.ts:47"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-regexp","severity":"medium","message":"RegExp() called with a `phrase` function argument, this might allow an attacker to cause a Regular Expression Denial-of-Service (ReDoS) within your application as RegExP blocks the main thread. For this reason, it is recommended to use hardcoded regexes instead. If your regex is run on user-controll [confidence low]","path":"trigger/src/pipeline/brave-source.ts","line":85,"fingerprint":"javascript.lang.security.audit.detect-non-literal-regexp:trigger/src/pipeline/brave-source.ts:85"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-regexp","severity":"medium","message":"RegExp() called with a `value` function argument, this might allow an attacker to cause a Regular Expression Denial-of-Service (ReDoS) within your application as RegExP blocks the main thread. For this reason, it is recommended to use hardcoded regexes instead. If your regex is run on user-controlle [confidence low]","path":"trigger/src/pipeline/brave-source.ts","line":91,"fingerprint":"javascript.lang.security.audit.detect-non-literal-regexp:trigger/src/pipeline/brave-source.ts:91"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-regexp","severity":"medium","message":"RegExp() called with a `round` function argument, this might allow an attacker to cause a Regular Expression Denial-of-Service (ReDoS) within your application as RegExP blocks the main thread. For this reason, it is recommended to use hardcoded regexes instead. If your regex is run on user-controlle [confidence low]","path":"trigger/src/pipeline/brave-source.ts","line":107,"fingerprint":"javascript.lang.security.audit.detect-non-literal-regexp:trigger/src/pipeline/brave-source.ts:107"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-redos","severity":"medium","message":"Detected the use of a regular expression `^(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$` which appears to be vulnerable to a Regular expression Denial-of-Service (ReDoS). For this reason, it is recommended to review the regex and ensure it is not vulnerable to catastrophic backtracking, and if p [confidence low]","path":"trigger/src/pipeline/domain-lookup.ts","line":357,"fingerprint":"javascript.lang.security.audit.detect-redos:trigger/src/pipeline/domain-lookup.ts:357"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-redos","severity":"medium","message":"Detected the use of a regular expression `^\\S+-based\\s+(?:\\S+\\s+){0,4}?(?:startup|start-up|firm|company|platform)\\s+` which appears to be vulnerable to a Regular expression Denial-of-Service (ReDoS). For this reason, it is recommended to review the regex and ensure it is not vulnerable to catastroph [confidence low]","path":"trigger/src/pipeline/filters.ts","line":111,"fingerprint":"javascript.lang.security.audit.detect-redos:trigger/src/pipeline/filters.ts:111"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-redos","severity":"medium","message":"Detected the use of a regular expression `^(?:\\S+\\s+){1,5}?(?:startup|start-up|firm|platform|company)\\s+` which appears to be vulnerable to a Regular expression Denial-of-Service (ReDoS). For this reason, it is recommended to review the regex and ensure it is not vulnerable to catastrophic backtrack [confidence low]","path":"trigger/src/pipeline/filters.ts","line":113,"fingerprint":"javascript.lang.security.audit.detect-redos:trigger/src/pipeline/filters.ts:113"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-redos","severity":"medium","message":"Detected the use of a regular expression `^(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$` which appears to be vulnerable to a Regular expression Denial-of-Service (ReDoS). For this reason, it is recommended to review the regex and ensure it is not vulnerable to catastrophic backtracking, and if p [confidence low]","path":"trigger/src/pipeline/taxonomy.ts","line":220,"fingerprint":"javascript.lang.security.audit.detect-redos:trigger/src/pipeline/taxonomy.ts:220"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-regexp","severity":"medium","message":"RegExp() called with a `tag` function argument, this might allow an attacker to cause a Regular Expression Denial-of-Service (ReDoS) within your application as RegExP blocks the main thread. For this reason, it is recommended to use hardcoded regexes instead. If your regex is run on user-controlled  [confidence low]","path":"trigger/src/sec-form-d-daily.ts","line":63,"fingerprint":"javascript.lang.security.audit.detect-non-literal-regexp:trigger/src/sec-form-d-daily.ts:63"},{"rule_id":"opengrep/javascript.lang.security.audit.detect-redos","severity":"medium","message":"Detected the use of a regular expression `^(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$` which appears to be vulnerable to a Regular expression Denial-of-Service (ReDoS). For this reason, it is recommended to review the regex and ensure it is not vulnerable to catastrophic backtracking, and if p [confidence low]","path":"trigger/src/sec-form-d-daily.ts","line":110,"fingerprint":"javascript.lang.security.audit.detect-redos:trigger/src/sec-form-d-daily.ts:110"},{"rule_id":"opengrep/javascript.lang.security.audit.unsafe-formatstring","severity":"low","message":"Detected string concatenation with a non-literal variable in a util.format / console.log function. If an attacker injects a format specifier in the string, it will forge the log message. Try to use constant values for the format string. [confidence low]","path":"cloudflare/clay-game-callback/src/index.ts","line":29,"fingerprint":"javascript.lang.security.audit.unsafe-formatstring:cloudflare/clay-game-callback/src/index.ts:29"},{"rule_id":"opengrep/javascript.lang.security.audit.unsafe-formatstring","severity":"low","message":"Detected string concatenation with a non-literal variable in a util.format / console.log function. If an attacker injects a format specifier in the string, it will forge the log message. Try to use constant values for the format string. [confidence low]","path":"trigger/get-run-logs.mjs","line":29,"fingerprint":"javascript.lang.security.audit.unsafe-formatstring:trigger/get-run-logs.mjs:29"},{"rule_id":"opengrep/javascript.lang.security.audit.unsafe-formatstring","severity":"low","message":"Detected string concatenation with a non-literal variable in a util.format / console.log function. If an attacker injects a format specifier in the string, it will forge the log message. Try to use constant values for the format string. [confidence low]","path":"trigger/scripts/list-env-names.mjs","line":4,"fingerprint":"javascript.lang.security.audit.unsafe-formatstring:trigger/scripts/list-env-names.mjs:4"},{"rule_id":"opengrep/javascript.lang.security.audit.unsafe-formatstring","severity":"low","message":"Detected string concatenation with a non-literal variable in a util.format / console.log function. If an attacker injects a format specifier in the string, it will forge the log message. Try to use constant values for the format string. [confidence low]","path":"trigger/scripts/trigger-task.mjs","line":10,"fingerprint":"javascript.lang.security.audit.unsafe-formatstring:trigger/scripts/trigger-task.mjs:10"}],"evidence":[],"data":{"rulesets":["python","typescript","javascript"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":7.0,"vulnerabilities":14.0,"vulns_critical":0.0,"vulns_high":6.0,"vulns_medium":7.0,"vulns_low":1.0,"vulns_unknown":0.0,"penalty":51.0},"findings":[{"rule_id":"osv/GHSA-ggr8-5vv4-36mx","severity":"high","message":"deepmerge-ts@7.1.5 (npm) is affected by GHSA-ggr8-5vv4-36mx","path":"trigger/package-lock.json","line":null,"fingerprint":"deepmerge-ts@7.1.5 (npm):GHSA-ggr8-5vv4-36mx"},{"rule_id":"osv/GHSA-68fv-2mgg-jv7q","severity":"high","message":"source-map-js@1.2.1 (npm) is affected by GHSA-68fv-2mgg-jv7q","path":"trigger/package-lock.json","line":null,"fingerprint":"source-map-js@1.2.1 (npm):GHSA-68fv-2mgg-jv7q"},{"rule_id":"osv/GHSA-3f7j-7jwc-fxfj","severity":"high","message":"systeminformation@5.33.15 (npm) is affected by GHSA-3f7j-7jwc-fxfj","path":"trigger/package-lock.json","line":null,"fingerprint":"systeminformation@5.33.15 (npm):GHSA-3f7j-7jwc-fxfj"},{"rule_id":"osv/GHSA-587h-7wmj-h5pm","severity":"high","message":"vite@8.2.2 (npm) is affected by GHSA-587h-7wmj-h5pm","path":"trigger/package-lock.json","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-587h-7wmj-h5pm"},{"rule_id":"osv/GHSA-96hv-2xvq-fx4p","severity":"high","message":"ws@8.17.1 (npm) is affected by GHSA-96hv-2xvq-fx4p","path":"trigger/package-lock.json","line":null,"fingerprint":"ws@8.17.1 (npm):GHSA-96hv-2xvq-fx4p"},{"rule_id":"osv/GHSA-mrhx-c7xc-m3w5","severity":"high","message":"zod@4.6.5 (npm) is affected by GHSA-mrhx-c7xc-m3w5","path":"trigger/package-lock.json","line":null,"fingerprint":"zod@4.6.5 (npm):GHSA-mrhx-c7xc-m3w5"},{"rule_id":"osv/GHSA-qxg6-89mg-rqv8","severity":"medium","message":"@vitest/mocker@4.1.11 (npm) is affected by GHSA-qxg6-89mg-rqv8","path":"trigger/package-lock.json","line":null,"fingerprint":"@vitest/mocker@4.1.11 (npm):GHSA-qxg6-89mg-rqv8"},{"rule_id":"osv/GHSA-xp26-3454-mjgp","severity":"medium","message":"@vitest/mocker@4.1.11 (npm) is affected by GHSA-xp26-3454-mjgp","path":"trigger/package-lock.json","line":null,"fingerprint":"@vitest/mocker@4.1.11 (npm):GHSA-xp26-3454-mjgp"},{"rule_id":"osv/GHSA-698v-4r3x-3vcv","severity":"medium","message":"vite@8.2.2 (npm) is affected by GHSA-698v-4r3x-3vcv","path":"trigger/package-lock.json","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-698v-4r3x-3vcv"},{"rule_id":"osv/GHSA-r825-w8mm-5pxw","severity":"medium","message":"vite@8.2.2 (npm) is affected by GHSA-r825-w8mm-5pxw","path":"trigger/package-lock.json","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-r825-w8mm-5pxw"},{"rule_id":"osv/GHSA-rq7h-c2jc-7f22","severity":"medium","message":"vite@8.2.2 (npm) is affected by GHSA-rq7h-c2jc-7f22","path":"trigger/package-lock.json","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-rq7h-c2jc-7f22"},{"rule_id":"osv/GHSA-vfpm-58rq-9qcg","severity":"medium","message":"vite@8.2.2 (npm) is affected by GHSA-vfpm-58rq-9qcg","path":"trigger/package-lock.json","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-vfpm-58rq-9qcg"},{"rule_id":"osv/GHSA-58qx-3vcg-4xpx","severity":"medium","message":"ws@8.17.1 (npm) is affected by GHSA-58qx-3vcg-4xpx","path":"trigger/package-lock.json","line":null,"fingerprint":"ws@8.17.1 (npm):GHSA-58qx-3vcg-4xpx"},{"rule_id":"osv/GHSA-9jrq-w75r-8gcw","severity":"low","message":"vite@8.2.2 (npm) is affected by GHSA-9jrq-w75r-8gcw","path":"trigger/package-lock.json","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-9jrq-w75r-8gcw"}],"evidence":[],"data":{"ecosystems":["PyPI","npm"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":0.0,"check:lockfiles":1.0,"signed_commit_share":0.1,"unpinned_manifests":0.0},"findings":[],"evidence":[],"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":2032.0,"function_nloc":31694.0,"mean_ccn":5.43,"p90_ccn":12.0,"complex_functions":138.0,"long_functions":17.0,"many_param_functions":17.0,"risky_nloc_share":0.3131},"findings":[],"evidence":[{"kind":"complex-function","description":"_validate in scripts/company_enrichment/packages.py: complexity 140, 351 lines","ref":"scripts/company_enrichment/packages.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/company_enrichment/packages.py#L237","weight":1.0},{"kind":"complex-function","description":"_extract_qualification in scripts/company_enrichment/cli.py: complexity 77, 298 lines","ref":"scripts/company_enrichment/cli.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/company_enrichment/cli.py#L945","weight":1.0},{"kind":"complex-function","description":"_load_source_plan in scripts/company_enrichment/cli.py: complexity 74, 168 lines","ref":"scripts/company_enrichment/cli.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/company_enrichment/cli.py#L59","weight":1.0},{"kind":"complex-function","description":"run in scripts/company_enrichment/experiment_runner.py: complexity 69, 271 lines","ref":"scripts/company_enrichment/experiment_runner.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/company_enrichment/experiment_runner.py#L242","weight":1.0},{"kind":"complex-function","description":"fillCompanyDomains in trigger/src/pipeline/company-domains.ts: complexity 66, 92 lines","ref":"trigger/src/pipeline/company-domains.ts","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/trigger/src/pipeline/company-domains.ts#L60","weight":1.0},{"kind":"complex-function","description":"score_payload in scripts/company_enrichment_icp_loop.py: complexity 55, 121 lines","ref":"scripts/company_enrichment_icp_loop.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/company_enrichment_icp_loop.py#L190","weight":0.9166666666666666},{"kind":"complex-function","description":"run in trigger/src/signal-bank-daily.ts: complexity 53, 219 lines","ref":"trigger/src/signal-bank-daily.ts","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/trigger/src/signal-bank-daily.ts#L345","weight":0.8833333333333333},{"kind":"complex-function","description":"match_field_present in scripts/gt_evaluator.py: complexity 52, 88 lines","ref":"scripts/gt_evaluator.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/gt_evaluator.py#L161","weight":0.8666666666666667},{"kind":"complex-function","description":"mode_calibrate in scripts/validate.py: complexity 52, 116 lines","ref":"scripts/validate.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/validate.py#L70","weight":0.8666666666666667},{"kind":"complex-function","description":"_append_state_event in scripts/research_orchestration/artifacts.py: complexity 48, 99 lines","ref":"scripts/research_orchestration/artifacts.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/research_orchestration/artifacts.py#L809","weight":0.8}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":39055.0,"duplicated_lines":2327.0,"duplicated_share":0.0596,"files":229.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: archive/2026-06-11-enrichment-prototypes/prototype-blitz-enrich.ts:73 and trigger/src/pipeline/blitz.ts:14","ref":"archive/2026-06-11-enrichment-prototypes/prototype-blitz-enrich.ts","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/archive/2026-06-11-enrichment-prototypes/prototype-blitz-enrich.ts#L73","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: archive/2026-06-11-enrichment-prototypes/prototype-blitz-enrich.ts:124 and trigger/src/pipeline/discolike.ts:59","ref":"archive/2026-06-11-enrichment-prototypes/prototype-blitz-enrich.ts","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/archive/2026-06-11-enrichment-prototypes/prototype-blitz-enrich.ts#L124","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: prompts/extract-companies-batch/iter.py:77 and scripts/pipeline_base.py:104","ref":"prompts/extract-companies-batch/iter.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/prompts/extract-companies-batch/iter.py#L77","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/anneal.py:113 and scripts/pattern_tester.py:553","ref":"scripts/anneal.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/anneal.py#L113","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/archive/dual_run_extraction.completed.py:105 and scripts/backfill_domains.py:327","ref":"scripts/archive/dual_run_extraction.completed.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/archive/dual_run_extraction.completed.py#L105","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/archive/dual_run_extraction.completed.py:108 and scripts/pipeline_base.py:501","ref":"scripts/archive/dual_run_extraction.completed.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/archive/dual_run_extraction.completed.py#L108","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/backfill_article_text.py:28 and scripts/raisingfi_ingest.py:310","ref":"scripts/backfill_article_text.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/backfill_article_text.py#L28","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/backfill_domains.py:46 and scripts/domain_resolver.py:46","ref":"scripts/backfill_domains.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/backfill_domains.py#L46","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/company_enrichment/adapters/google_ads.py:138 and scripts/company_enrichment/adapters/parallel.py:210","ref":"scripts/company_enrichment/adapters/google_ads.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/company_enrichment/adapters/google_ads.py#L138","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scripts/company_enrichment/adapters/parallel.py:41 and scripts/company_enrichment/adapters/serper.py:25","ref":"scripts/company_enrichment/adapters/parallel.py","url":"https://github.com/LeadGrowGTM/research-process-builder/blob/2b49aac264ac3305ce1a7fc1c6663c58189baa06/scripts/company_enrichment/adapters/parallel.py#L41","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":54.0,"weighted_findings":75.25,"scanned_lines":50144.0,"category:best-practice":30.0,"category:correctness":16.0,"category:maintainability":8.0},"findings":[{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"prompts/extract-companies-batch/score.py","line":116,"fingerprint":"python.lang.best-practice.arbitrary-sleep:prompts/extract-companies-batch/score.py:116"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/agent_research.py","line":239,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/agent_research.py:239"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/agent_research.py","line":249,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/agent_research.py:249"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/anneal.py","line":347,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/anneal.py:347"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/backfill_article_text.py","line":136,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/backfill_article_text.py:136"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/company_enrichment/_locking.py","line":40,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/company_enrichment/_locking.py:40"},{"rule_id":"opengrep/python.lang.correctness.tempfile.tempfile-without-flush","severity":"high","message":"Using 'stream.name' without '.flush()' or '.close()' may cause an error because the file may not exist when 'stream.name' is used. Use '.flush()' or close the file before using 'stream.name'.","path":"scripts/company_enrichment/dossier_runner.py","line":82,"fingerprint":"python.lang.correctness.tempfile.tempfile-without-flush:scripts/company_enrichment/dossier_runner.py:82"},{"rule_id":"opengrep/python.lang.correctness.tempfile.tempfile-without-flush","severity":"high","message":"Using 'stream.name' without '.flush()' or '.close()' may cause an error because the file may not exist when 'stream.name' is used. Use '.flush()' or close the file before using 'stream.name'.","path":"scripts/company_enrichment/evidence.py","line":394,"fingerprint":"python.lang.correctness.tempfile.tempfile-without-flush:scripts/company_enrichment/evidence.py:394"},{"rule_id":"opengrep/python.lang.maintainability.useless-inner-function","severity":"high","message":"function `inventor` is defined inside a function but never used","path":"scripts/company_enrichment_icp_loop.py","line":427,"fingerprint":"python.lang.maintainability.useless-inner-function:scripts/company_enrichment_icp_loop.py:427"},{"rule_id":"opengrep/python.lang.maintainability.useless-inner-function","severity":"high","message":"function `checker` is defined inside a function but never used","path":"scripts/company_enrichment_icp_loop.py","line":432,"fingerprint":"python.lang.maintainability.useless-inner-function:scripts/company_enrichment_icp_loop.py:432"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/motorica_collect_copy_e1.py","line":118,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/motorica_collect_copy_e1.py:118"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/pattern_tester.py","line":756,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/pattern_tester.py:756"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/pipeline_base.py","line":904,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/pipeline_base.py:904"},{"rule_id":"opengrep/python.lang.best-practice.arbitrary-sleep","severity":"high","message":"time.sleep() call; did you mean to leave this in?","path":"scripts/trigger_run.py","line":85,"fingerprint":"python.lang.best-practice.arbitrary-sleep:scripts/trigger_run.py:85"},{"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":"prompts/extract-companies-batch/score.py","line":160,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:prompts/extract-companies-batch/score.py:160"},{"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":"scripts/_run_copy_worker_e2.py","line":9,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:scripts/_run_copy_worker_e2.py:9"},{"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":"scripts/backfill_domains.py","line":387,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/backfill_domains.py:387"},{"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":"scripts/check_pl_table.py","line":16,"fingerprint":"python.lang.correctness.use-sys-exit:scripts/check_pl_table.py:16"},{"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":"scripts/check_pl_table.py","line":21,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/check_pl_table.py:21"},{"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":"scripts/check_pl_table.py","line":25,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/check_pl_table.py:25"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_quality_failure\" a function or an attribute? If it is a function, you may have meant module.is_quality_failure() because module.is_quality_failure is always true.","path":"scripts/company_enrichment/adapters/known_url_scrape.py","line":117,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/company_enrichment/adapters/known_url_scrape.py:117"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_b2b\" a function or an attribute? If it is a function, you may have meant profile.is_b2b() because profile.is_b2b is always true.","path":"scripts/company_enrichment/providers.py","line":188,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/company_enrichment/providers.py:188"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_ecommerce_or_cpg\" a function or an attribute? If it is a function, you may have meant profile.is_ecommerce_or_cpg() because profile.is_ecommerce_or_cpg is always true.","path":"scripts/company_enrichment/providers.py","line":190,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/company_enrichment/providers.py:190"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_saturated\" a function or an attribute? If it is a function, you may have meant tracker.is_saturated() because tracker.is_saturated is always true.","path":"scripts/company_enrichment/runner.py","line":277,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scripts/company_enrichment/runner.py:277"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/eval_iter.py","line":27,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/eval_iter.py:27"},{"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":"scripts/pipeline_base.py","line":191,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/pipeline_base.py:191"},{"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":"scripts/pipeline_base.py","line":261,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/pipeline_base.py:261"},{"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":"scripts/pipeline_base.py","line":277,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/pipeline_base.py:277"},{"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":"scripts/pipeline_base.py","line":312,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/pipeline_base.py:312"},{"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":"scripts/pipeline_base.py","line":552,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/pipeline_base.py:552"},{"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":"scripts/pipeline_base.py","line":1050,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/pipeline_base.py:1050"},{"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":"scripts/probe_lgenrich.py","line":30,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/probe_lgenrich.py:30"},{"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":"scripts/probe_lgenrich.py","line":34,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/probe_lgenrich.py:34"},{"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":"scripts/probe_lgenrich_raw.py","line":20,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/probe_lgenrich_raw.py:20"},{"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":"scripts/product_launch_ph_pipeline.py","line":124,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/product_launch_ph_pipeline.py:124"},{"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":"scripts/product_launch_ph_pipeline.py","line":194,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/product_launch_ph_pipeline.py:194"},{"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":"scripts/push_lgenrich_key_to_trigger.py","line":37,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/push_lgenrich_key_to_trigger.py:37"},{"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":"scripts/raisingfi_ingest.py","line":333,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/raisingfi_ingest.py:333"},{"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":"scripts/recall_analysis.py","line":33,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/recall_analysis.py:33"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scripts/recall_analysis.py","line":70,"fingerprint":"python.lang.maintainability.return-not-in-function:scripts/recall_analysis.py:70"},{"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":"scripts/trigger_run.py","line":35,"fingerprint":"python.requests.best-practice.use-raise-for-status:scripts/trigger_run.py:35"},{"rule_id":"opengrep/javascript.lang.correctness.no-stringify-keys","severity":"medium","message":"JSON stringify does not produce a stable key ordering, and should not be relied on for producing object keys. Consider using json-stable-stringify instead.","path":"trigger/drain-enrichment-backlog.mjs","line":43,"fingerprint":"javascript.lang.correctness.no-stringify-keys:trigger/drain-enrichment-backlog.mjs:43"},{"rule_id":"opengrep/javascript.lang.correctness.no-stringify-keys","severity":"medium","message":"JSON stringify does not produce a stable key ordering, and should not be relied on for producing object keys. Consider using json-stable-stringify instead.","path":"trigger/drain-enrichment-backlog.mjs","line":44,"fingerprint":"javascript.lang.correctness.no-stringify-keys:trigger/drain-enrichment-backlog.mjs:44"},{"rule_id":"opengrep/javascript.lang.correctness.no-stringify-keys","severity":"medium","message":"JSON stringify does not produce a stable key ordering, and should not be relied on for producing object keys. Consider using json-stable-stringify instead.","path":"trigger/src/pipeline/game-signals-pipeline.ts","line":121,"fingerprint":"javascript.lang.correctness.no-stringify-keys:trigger/src/pipeline/game-signals-pipeline.ts:121"},{"rule_id":"opengrep/javascript.lang.correctness.no-stringify-keys","severity":"medium","message":"JSON stringify does not produce a stable key ordering, and should not be relied on for producing object keys. Consider using json-stable-stringify instead.","path":"trigger/src/pipeline/scrape.ts","line":99,"fingerprint":"javascript.lang.correctness.no-stringify-keys:trigger/src/pipeline/scrape.ts:99"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"trigger/scripts/discovery-eval.ts","line":191,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:trigger/scripts/discovery-eval.ts:191"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"trigger/scripts/discovery-eval.ts","line":191,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:trigger/scripts/discovery-eval.ts:191"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"trigger/scripts/discovery-eval.ts","line":207,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:trigger/scripts/discovery-eval.ts:207"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"trigger/scripts/discovery-eval.ts","line":207,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:trigger/scripts/discovery-eval.ts:207"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"trigger/src/pipeline/domain-lookup.ts","line":231,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:trigger/src/pipeline/domain-lookup.ts:231"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"trigger/src/pipeline/domain-lookup.ts","line":231,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:trigger/src/pipeline/domain-lookup.ts:231"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"trigger/src/pipeline/product-launches-news.ts","line":229,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:trigger/src/pipeline/product-launches-news.ts:229"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"trigger/src/pipeline/product-launches-news.ts","line":229,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:trigger/src/pipeline/product-launches-news.ts:229"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"trigger/src/pipeline/round-configs.ts","line":38,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:trigger/src/pipeline/round-configs.ts:38"}],"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":0.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":1.0,"test_lines":29230.0,"source_lines":50553.0,"test_ratio":0.5782,"ci_files":0.0,"cochange_share":0.6875,"cochange_commits":176.0},"findings":[],"evidence":[],"data":{"test_commands":[],"lint_commands":[]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":1.0,"check:contributing":0.0,"check:changelog":0.0,"readme_lines":123.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":0.2565,"check:low_escape_density":0.0,"escapes":409.0,"escapes_per_kloc":8.315},"findings":[],"evidence":[{"kind":"typing","description":"TypeScript strict type checking: trigger/tsconfig.json","ref":"trigger/tsconfig.json","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":35304.0,"other_lines":15249.0,"files_blamed":229.0,"blame_failures":0.0,"quality:ai_findings":46.0,"quality:ai_per_kloc":1.303,"quality:other_findings":8.0,"quality:other_per_kloc":0.525,"quality:ratio":2.48,"security:ai_findings":38.0,"security:ai_per_kloc":1.076,"security:other_findings":6.0,"security:other_per_kloc":0.393,"security:ratio":2.74},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":true},"error":null}],"flags":[]}