{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-13T23:18:48.851210Z","repo":{"ref":{"host":"github.com","owner":"Hugo-Grellier","name":"SecondChair"},"default_branch":"main","clone_url":"https://github.com/Hugo-Grellier/SecondChair.git","html_url":"https://github.com/Hugo-Grellier/SecondChair","description":"Human-directed, AI-operated campaign director for tabletop GMs (PF2e + Foundry first)","stars":0,"forks":0,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":2508,"primary_language":"Python","license_spdx":"AGPL-3.0","created_at":"2026-10-18T17:07:35Z","pushed_at":"2026-10-22T21:01:01Z","security_policy_url":null,"distribution":{"owner_created_at":"2021-10-05T07:28:16Z","owner_type":"User","release_assets":[]}},"commit_sha":"72137366607bddc7ffca7b83610d921fbeb077eb","profile":{"lines_by_language":{"Python":33583,"JavaScript":7648,"TypeScript":220},"files_by_category":{"docs":127,"source":78,"test":75,"config":27,"other":5,"generated":2},"source_lines":21747,"test_lines":19704},"pillars":{"ai_provenance":{"score":99.6,"confidence":0.95,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.9957,"suspected_share":0.0,"estimated_share":0.9957,"ai_artifacts":3.0,"flagged_work_units":8.0,"flagged_releases":null},"summary":"Explicit AI attribution on 100% of first-party code added; an estimated 100% including velocity signals."},"quality":{"score":71.8,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":41.1,"duplication":96.3,"lint":69.2,"testing":100.0,"docs":65.0,"type_safety":0.7,"process":null},"summary":"Code quality is adequate: test-to-source ratio 0.91, CI runs tests; 30% of function code in complex or long functions; 1% duplicated lines. Weakest area: type safety."},"security":{"score":80.3,"confidence":0.85,"coverage":1.0,"label":"adequate","breakdown":{"secrets":96.7,"sast":76.1,"dependencies":79.2,"ci_actions":100.0,"posture":20.0,"scorecard":null},"summary":"Security posture is adequate: 6 known vulnerabilities in 3 dependencies; 7 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":19.0,"checked":19.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":175.0,"attributed_commits":172.0,"attributed_commit_share":0.9828571428571429,"effective_loc":43663.0,"attributed_loc":43477.0,"attributed_loc_share":0.9957401003137668,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 172 attributed commits, 43,477 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"72137366607bddc7ffca7b83610d921fbeb077eb","url":"https://github.com/Hugo-Grellier/SecondChair/commit/72137366607bddc7ffca7b83610d921fbeb077eb","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"d171bd9c0f1deedb6e1ccf523e00557dd8b13afd","url":"https://github.com/Hugo-Grellier/SecondChair/commit/d171bd9c0f1deedb6e1ccf523e00557dd8b13afd","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"8ecaa09892413992beae497228729bd4517a28f4","url":"https://github.com/Hugo-Grellier/SecondChair/commit/8ecaa09892413992beae497228729bd4517a28f4","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"be4d53c8e29b8ef42345493e8000e02aeabbba6f","url":"https://github.com/Hugo-Grellier/SecondChair/commit/be4d53c8e29b8ef42345493e8000e02aeabbba6f","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"3c8cb5061b4b7719c99715879278087046c02049","url":"https://github.com/Hugo-Grellier/SecondChair/commit/3c8cb5061b4b7719c99715879278087046c02049","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"19df48765047a9a611344f314d2b89b7ef9c9bd2","url":"https://github.com/Hugo-Grellier/SecondChair/commit/19df48765047a9a611344f314d2b89b7ef9c9bd2","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"a17e7fd0a1084bd612b5c99bc0a1e8bbe2b7a4f0","url":"https://github.com/Hugo-Grellier/SecondChair/commit/a17e7fd0a1084bd612b5c99bc0a1e8bbe2b7a4f0","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"161dcf09b65dbdb348942720785a71632061f55f","url":"https://github.com/Hugo-Grellier/SecondChair/commit/161dcf09b65dbdb348942720785a71632061f55f","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"2957407e1cd94c78b770e80beee403d20b8e1b25","url":"https://github.com/Hugo-Grellier/SecondChair/commit/2957407e1cd94c78b770e80beee403d20b8e1b25","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"985150b63fbcd0e4fc448c4c556dc8594ce89cab","url":"https://github.com/Hugo-Grellier/SecondChair/commit/985150b63fbcd0e4fc448c4c556dc8594ce89cab","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"04ff7c06c1f5cc2821d591b1963e27e4fa60a680","url":"https://github.com/Hugo-Grellier/SecondChair/commit/04ff7c06c1f5cc2821d591b1963e27e4fa60a680","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"bf48df1ea0b8bfb970bae8cfe58e19e4f4de8632","url":"https://github.com/Hugo-Grellier/SecondChair/commit/bf48df1ea0b8bfb970bae8cfe58e19e4f4de8632","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"9a98cf28cb09a7b2dd834fb7a924557213206c11","url":"https://github.com/Hugo-Grellier/SecondChair/commit/9a98cf28cb09a7b2dd834fb7a924557213206c11","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"754a60487e19f63126dc44d379cd737fe61e9791","url":"https://github.com/Hugo-Grellier/SecondChair/commit/754a60487e19f63126dc44d379cd737fe61e9791","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"082d6bd7b4a42ab1ca298c5b776dd4d8c9bd99fe","url":"https://github.com/Hugo-Grellier/SecondChair/commit/082d6bd7b4a42ab1ca298c5b776dd4d8c9bd99fe","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"66945427d9dc8514e53677d9c791edaecd49ed64","url":"https://github.com/Hugo-Grellier/SecondChair/commit/66945427d9dc8514e53677d9c791edaecd49ed64","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"6bea7f558c54369c125e6f7accf47742b9ff3439","url":"https://github.com/Hugo-Grellier/SecondChair/commit/6bea7f558c54369c125e6f7accf47742b9ff3439","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"744dc9088d5ed832f592f48e4f65d0acc20fcc5b","url":"https://github.com/Hugo-Grellier/SecondChair/commit/744dc9088d5ed832f592f48e4f65d0acc20fcc5b","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"a5e02d1f5b511d6adaf7eab46daefdd32dcda01d","url":"https://github.com/Hugo-Grellier/SecondChair/commit/a5e02d1f5b511d6adaf7eab46daefdd32dcda01d","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"9122cd94c9f0875d54e41757ee6675fae8f507d7","url":"https://github.com/Hugo-Grellier/SecondChair/commit/9122cd94c9f0875d54e41757ee6675fae8f507d7","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"c79a5a49d9ae5d24a1a0e3cc74a0570656f62071","url":"https://github.com/Hugo-Grellier/SecondChair/commit/c79a5a49d9ae5d24a1a0e3cc74a0570656f62071","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"1b63432f4ad238de963d211d6eaa5ee229b0e9f5","url":"https://github.com/Hugo-Grellier/SecondChair/commit/1b63432f4ad238de963d211d6eaa5ee229b0e9f5","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"0737a7dda3010f4c3e9ed76f5643e8d7ee99933e","url":"https://github.com/Hugo-Grellier/SecondChair/commit/0737a7dda3010f4c3e9ed76f5643e8d7ee99933e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"3d433148886abec4dd1ad380acd8edaee6ebdbb1","url":"https://github.com/Hugo-Grellier/SecondChair/commit/3d433148886abec4dd1ad380acd8edaee6ebdbb1","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: message 'Generated with Claude Code'","ref":"7b51e3ad99f9c6baf81ea6f88ae82104307dd9c2","url":"https://github.com/Hugo-Grellier/SecondChair/commit/7b51e3ad99f9c6baf81ea6f88ae82104307dd9c2","weight":0.9}],"data":{"attributed_loc_by_commit":{"ec951a3169cf63c8b210a068178b8b83499c4638":0,"9d30efab5f639e47bdc10ec2715ac63c036d71da":0,"8e26b8ed6a4577bae46f3c68b599f9cf10988e89":0,"2fe8fbae9d70253d80d9f10e88d85ae20f97715c":0,"b585e48bd5dcf9f7290e1f4874d7f637909160a9":0,"f7ab9ae876fe936b08c6784f0583960318b61cea":0,"fe1e5e007af2e400905134fe6676690747635574":0,"8142eb684d8c8c25f294d3fb706e568203e322a4":0,"8574a47a4e433cf09fef7d4e0bfea91bf9dab2b8":0,"191ff571e2284e06bf5209f593f5672b838da5d1":0,"63715030ea04fce23c072401ea9f8c76f8093fae":0,"4cf549dabb62e7bffe0a549e33dbb5b43df35811":0,"dab522f551e2fb8c93a30b8bc2cbfedee3c6060c":0,"7afabd5c9b6c5014c763d5b9c10a0a31a2aa56c4":0,"d93a5ed88adaf7f348fb348a818fcf97225d7648":0,"61f4bfdddb58e407f79d1f8be2c488e59a3de8d0":0,"65212f5adf3fae2ffbc90cdb4592f26303329ffc":0,"1e9c028bb776d759741e11f1b62021c6cbc37021":0,"c708cac29323cd7a182702babb029616eefe0acc":0,"f1b5b6b3bb62714cf8320d73cc5787ac9a2639a8":0,"ed279ac42e5d1dde7c5f5097ba6af14126ad96ea":0,"dd8f942692f9d0f8199bf56ba960f182eab13d6b":0,"df2244a71a51b7c9e22cd21d7d2472eccffd890e":0,"8c1a367c9c619b01f77b89eba3c45af9f3ca875b":0,"4984b28e43394ea8810901b3f43405ae02a1dd36":0,"5d5836a625a38a8ef02ff8751cfa1d16c0e72fdc":0,"b2e30964374b9801154af6d1ef2384fa2357df30":0,"dc25d29b67c05eadaa2269697c94110e909f8866":0,"8e423c1961d3859915df1a9b129f190980644c19":0,"28f5eb479cab3a199e90ab70fda4d1ab1d99270c":0,"8da4e60fd90f8ed7d1556a89f022023615a5831f":0,"ce59915fa3cbd7344ba417188482492b81cab440":0,"345b762e00edff5a4580efc9866c7c0d83d5dd17":0,"86694c069a948e9effb4e1539730a8ec2f6d4fa1":0,"ec6482f0e991bec253e684e7466a77c593bbc8c3":0,"c55ddf81877a69c6d7ba2186cb99e959a1053e1c":0,"dd902f84185dd178b3e9080f9d8a2547be3d7f86":0,"b08b7fcb8034f9cf6f11a80f8d023b239011eb99":0,"8fe95a53f2a7e0ce76d0a0c7d2d2b7f8b20f9baa":0,"75a3b23cde15d4295ec4ed2fd2ee3fd61e96ba2e":0,"ff79bba92d83c265b3323fc3fc11311450baa400":0,"c3c905aac17272a39d47f3aac2feb98a01bd87c9":421,"8e5131031a17f04a6773d0c4b9d9fa2651da9251":612,"8e87181febdacf0c9e779729a361950ebb5740ef":504,"7a86ea7c624ec73206921d33bde655eb9bc4398e":788,"766e7137146044be8f3e2e42bc35cae907cec77c":662,"ab89fdb7edc7218e0a434f161e4f5b44b9f8b468":1185,"728ae39d2ab8c2da04b307dc0114bb04c2de7214":140,"49a21286c0a1f3b0ef57094974a36b7cbdcb3d35":700,"f5115c5209617e560493570592dd0e00d71fea56":863,"900f2b620668f1e90aef42fdda571f37b866b56f":412,"b54b1642c5a60505541184847c6aa0697c176590":854,"a8332ed223b48299ce29385731fef73b0141687f":881,"b011a419e63624c34c7c7f89415b9b2767180acf":679,"f87c2af8d84d77e91e64ce2882d8cf9404ca2f04":151,"44f786661aa2071d8dc032178cfc0de99ee4396f":476,"33bb775b5bf1bae8494be9c2cc23fbcd46d455c6":650,"626d4d34692dbcf4e9c94ebfb98cfca2bf08d24a":605,"83421327fdaa9714c45c8ab2638e72e7ef0a6d1a":355,"f0d1bf7ee67022dc0b789ac8a95bc17e0a1b54be":1036,"45fe0f852e0addba5c6a24d9c83dfaa5ccefd372":1630,"b96824c1f1c4bcb5e5650c800442d31885f373bf":1129,"6934f744e3bc7ff27cf600f4239e1047cebc18a2":826,"24f50aac4df4b00e09b46643fe4fd5542089de23":816,"d5f6e60bda3b7c4cba7a76c7934c099c436a2828":291,"b0c23f1197749b26a5743e0c32421787d521ddb0":251,"cabc9fea3f73670ef91c6827c72fd21cdb1d3002":464,"ea9f0bf85dd2166384b1b5ebfb9240aa62f20c9e":1292,"8d5b0fb65981e9c544417b66cb339e50a40e593a":440,"d5a866dbbae16d545f003e8571b32e89404165ad":637,"abec0ba13ba68266cd0fb4c9af415103e78f4a0c":1424,"a9d4d8ea5b184489fd7a64767e0f73c3ca8982af":829,"e1542fea1626f8aaf0b13c2d596abb9eb8b69cfe":879,"bd176ac3d9076fa28ebcc3bacab4aeab793491a3":764,"9ebbba68035d643a656e4c80cc6d40816f464e8b":188,"96e1c55a780272895c2ecf10ae8df262b48898b9":0,"031b8c94aa1256639909c008e3ef14407b69e2e8":40,"d5c65595ef5ae3b0d3296ddbfc78a90151cfd32f":96,"9668285373603481110b18c4dc6973824db97b6a":64,"58180a2681a66773a273115303a2f89f338ff440":45,"ed559bc7da70911cac2c82304e49c6699e88f04f":80,"d5fb223406f85575fe332df32937dd51fd5e1963":30,"6d284921324dda180738930aa0d78b986359df7e":348,"7f6fd62cac78c9a047ee7679577a45fa6150646f":12,"b14dc2981205e627117e3c8b6bb8b0da6fed959e":0,"84c64cd68eea97d092c453fec51d98ffc0d2a2ad":218,"82ff790c728928c78846214650badf0d50daaab1":64,"c9b8aa90c1023ec6325ca006e35715d18fca946f":202,"9b6d7a68a042f99e762aaf9eec8266c7c24102b5":25,"aa99535649f4dff1d08db166fdbda9a1a23b47eb":127,"e45ccd947b507e219fbed2c7bdb9a276d2d0a246":115,"f77c97c3e72bb119be07a8b621bae0049613a1ec":1,"7e08c9bfadea5725c406791331b1141245037782":19,"05262b4d64487c7af2d830d0e2320749eb6a455c":13,"cf190129f6ed344a3734be26dfd4ced60aa257d3":11,"8d69ce27088f7069226abb3df42aaa9e1017840d":11,"e3b23adf72a8de94d4f64e22b68ac939e30ff202":12,"7bb6ea9201d7840c6c091f9f502c8efd2864c7ad":161,"0d411913db5c44d6fccac118d9664d91c0024a24":157,"1eb9c442c4c05a4dde1f6101d2dc7ecf08d9c7e3":191,"c1ebb594bce17fca42b112bb788fa3b6b2d46bf9":210,"806462509444be07fe7c6dfb354fe8d898f68179":552,"06ef129db3a090fcb0328ba7042f5d5a2241d15a":2064,"c0a50b33b8ed81a6f5df59ba9392ce4ebd908a4e":1178,"e96207e219fe84a091ab5f700e38ef81a41e9052":0,"19ae52b56b40fc41300f44be6e477d7928d50001":68,"f13f11ef018b623050b826741bfcf45f8656e4ac":3,"86f7d5d85812dcb5ee775b8d2952d64146e35ee6":80,"aeed8db2b36cb07947fff8ad613939244b928dfa":40,"35ed27058e8a661278df29278e0f12ff987a7fbd":71,"fb7bebf24be0fb7ba35e41544a3588335030c1e1":0,"a219595328e4c5ffb7ed7f91170495414b7d64ed":0,"e6e49ddf69e6c0885ce586d3cf80677b64410b48":120,"ecd20cb885fc54cf36a1bedb5eda02fda4375d0c":26,"4d85569819128c47a5172fe2572714ae97c6773d":0,"36ef6bc16d7d4f2b0c5e6062a1046c71ae00d39f":0,"73e41a04b17bb784fe2e90d779e4fac16a994e31":0,"71e59d83fd32a0aaa122c6f9ae732a657b9abc8b":0,"cd1c7bde4248c6970c87e0468c639f39c93feef8":0,"a8490376a2be5282c5cd2f50a2b5b8b4c85264dd":43,"85baf14c4d4e487f928b29767dc229b36bfe0b72":142,"0f700a95c96575f0c19ed61fef7f0f6ff831e307":17,"dbe97fb7029d085bd0ea45468ecb56ca3398b175":0,"1c52ec95f712fc14ee3f3acc295fce5b52a84f0e":223,"fccdc91280aed583d8774a16cb01d5b3743f9322":146,"4cf2bfe419bbb34a8c82d48f296987ce7b6f5e2d":428,"782f932e4949002035c890294ea24b8869515b7e":411,"1871b269269638f9d3a02689857222b1b5ae1b1f":104,"e75a319328d72cc34e26a221d119971b666508c2":114,"160ddba56796e8bcdf5ae0032537a9141054b6a8":1078,"392ec61ca244dc18571284658f450509fdd38847":106,"68478cbffc6d4a1dc2ff63b40f2b7b8d99a3cc5c":182,"fbd4f7f370d772c2f996a4946075b10501faa30a":49,"2451abbc82b980c609356233f47204065eff129c":502,"952832b2420441f35e201cce024ed5def45107b2":141,"db50f07765f8cd38b0cf67f28bc3359da6674cc7":0,"6bc764ae7b9bf82951da063a5d18fcd978604c44":238,"3d4fa18493188869fd5270513d00f3c30ea6e64a":171,"b051564085297009f5df1cc85b37177d42b5cc2e":173,"7e34fb6e3b7ef42e42ab79014b5d66ee0773577b":592,"ce7521c7c96e6429507156cf7b4346c7d6fe2ae3":802,"a5b55e39f2f5796f60590eb6e8753ccf8eb27db3":218,"b9e74f5624151858ba33381e5060cb813be5a078":381,"653a12bbacfd306137ab795eb4d9bc068323191b":460,"2674060be216c5159e21049b7d5d36f7bfe300e7":311,"d179a1875733e780799f58fbe1770bc6152130eb":319,"32b8720f8e11e86dfa7c40eaa0d11366fc98e8a2":94,"7b51e3ad99f9c6baf81ea6f88ae82104307dd9c2":0,"3d433148886abec4dd1ad380acd8edaee6ebdbb1":51,"0737a7dda3010f4c3e9ed76f5643e8d7ee99933e":202,"1b63432f4ad238de963d211d6eaa5ee229b0e9f5":139,"c79a5a49d9ae5d24a1a0e3cc74a0570656f62071":230,"9122cd94c9f0875d54e41757ee6675fae8f507d7":273,"a5e02d1f5b511d6adaf7eab46daefdd32dcda01d":164,"744dc9088d5ed832f592f48e4f65d0acc20fcc5b":182,"6bea7f558c54369c125e6f7accf47742b9ff3439":116,"66945427d9dc8514e53677d9c791edaecd49ed64":166,"082d6bd7b4a42ab1ca298c5b776dd4d8c9bd99fe":0,"754a60487e19f63126dc44d379cd737fe61e9791":37,"9a98cf28cb09a7b2dd834fb7a924557213206c11":0,"bf48df1ea0b8bfb970bae8cfe58e19e4f4de8632":455,"04ff7c06c1f5cc2821d591b1963e27e4fa60a680":23,"985150b63fbcd0e4fc448c4c556dc8594ce89cab":0,"2957407e1cd94c78b770e80beee403d20b8e1b25":124,"161dcf09b65dbdb348942720785a71632061f55f":159,"a17e7fd0a1084bd612b5c99bc0a1e8bbe2b7a4f0":736,"19df48765047a9a611344f314d2b89b7ef9c9bd2":411,"3c8cb5061b4b7719c99715879278087046c02049":830,"be4d53c8e29b8ef42345493e8000e02aeabbba6f":540,"8ecaa09892413992beae497228729bd4517a28f4":73,"d171bd9c0f1deedb6e1ccf523e00557dd8b13afd":217,"72137366607bddc7ffca7b83610d921fbeb077eb":616},"tools":{"claude-code":{"name":"Claude Code","commits":172,"loc":43477,"first_seen":1792343385,"last_seen":1792700948}},"monthly":{"2026-10":{"loc":43663,"attributed_loc":43477}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":3.0,"workflow_agents":0.0,"tools_configured":2.0,"earliest_adoption":1792567337.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":".claude/skills (claude-code configuration)","ref":".claude/skills","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/.claude/skills","weight":0.5},{"kind":"ai-artifact","description":"CLAUDE.md (claude-code configuration)","ref":"CLAUDE.md","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/CLAUDE.md","weight":0.5},{"kind":"ai-artifact","description":"AGENTS.md (generic-agent configuration)","ref":"AGENTS.md","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/AGENTS.md","weight":0.5}],"data":{"artifacts":[{"tool":"claude-code","path":".claude/skills","added_at":1792567337},{"tool":"claude-code","path":"CLAUDE.md","added_at":1792567337},{"tool":"generic-agent","path":"AGENTS.md","added_at":1792567337}],"workflows":[],"tools":["claude-code","generic-agent"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":116.0,"flagged_units":8.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":43663.0,"flagged_loc":10838.0,"flagged_loc_share":0.24821931612578155,"max_loc_per_hour":3260.0,"median_loc_per_hour":241.94470924690182,"pr_timed_units":115.0,"excluded_import_loc":0.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"1,630 lines of first-party code in ~0.5h (3,260 lines/hour, PR #105)","ref":"45fe0f852e0addba5c6a24d9c83dfaa5ccefd372","url":"https://github.com/Hugo-Grellier/SecondChair/commit/45fe0f852e0addba5c6a24d9c83dfaa5ccefd372","weight":0.6},{"kind":"velocity-burst","description":"1,424 lines of first-party code in ~0.5h (2,848 lines/hour, PR #124)","ref":"abec0ba13ba68266cd0fb4c9af415103e78f4a0c","url":"https://github.com/Hugo-Grellier/SecondChair/commit/abec0ba13ba68266cd0fb4c9af415103e78f4a0c","weight":0.6},{"kind":"velocity-burst","description":"1,185 lines of first-party code in ~0.5h (2,370 lines/hour, PR #87)","ref":"ab89fdb7edc7218e0a434f161e4f5b44b9f8b468","url":"https://github.com/Hugo-Grellier/SecondChair/commit/ab89fdb7edc7218e0a434f161e4f5b44b9f8b468","weight":0.6},{"kind":"velocity-burst","description":"1,129 lines of first-party code in ~0.5h (2,258 lines/hour, PR #107)","ref":"b96824c1f1c4bcb5e5650c800442d31885f373bf","url":"https://github.com/Hugo-Grellier/SecondChair/commit/b96824c1f1c4bcb5e5650c800442d31885f373bf","weight":0.6},{"kind":"velocity-burst","description":"1,078 lines of first-party code in ~0.5h (2,156 lines/hour, PR #230)","ref":"160ddba56796e8bcdf5ae0032537a9141054b6a8","url":"https://github.com/Hugo-Grellier/SecondChair/commit/160ddba56796e8bcdf5ae0032537a9141054b6a8","weight":0.6},{"kind":"velocity-burst","description":"1,036 lines of first-party code in ~0.5h (2,072 lines/hour, PR #103)","ref":"f0d1bf7ee67022dc0b789ac8a95bc17e0a1b54be","url":"https://github.com/Hugo-Grellier/SecondChair/commit/f0d1bf7ee67022dc0b789ac8a95bc17e0a1b54be","weight":0.6},{"kind":"velocity-burst","description":"2,064 lines of first-party code in ~3.6h (569 lines/hour, PR #158)","ref":"06ef129db3a090fcb0328ba7042f5d5a2241d15a","url":"https://github.com/Hugo-Grellier/SecondChair/commit/06ef129db3a090fcb0328ba7042f5d5a2241d15a","weight":0.1707222179673738},{"kind":"velocity-burst","description":"1,292 lines of first-party code in ~2.4h (548 lines/hour, PR #110)","ref":"ea9f0bf85dd2166384b1b5ebfb9240aa62f20c9e","url":"https://github.com/Hugo-Grellier/SecondChair/commit/ea9f0bf85dd2166384b1b5ebfb9240aa62f20c9e","weight":0.1645083706672954}],"data":{"flagged_loc_by_commit":{"ab89fdb7edc7218e0a434f161e4f5b44b9f8b468":1185,"f0d1bf7ee67022dc0b789ac8a95bc17e0a1b54be":1036,"45fe0f852e0addba5c6a24d9c83dfaa5ccefd372":1630,"b96824c1f1c4bcb5e5650c800442d31885f373bf":1129,"ea9f0bf85dd2166384b1b5ebfb9240aa62f20c9e":1292,"abec0ba13ba68266cd0fb4c9af415103e78f4a0c":1424,"06ef129db3a090fcb0328ba7042f5d5a2241d15a":2064,"160ddba56796e8bcdf5ae0032537a9141054b6a8":1078},"excluded_import_commits":[]},"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":21747.0,"index":0.0,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":1.0,"secrets_low_confidence":0.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/contracts/workspace-layout.md","line":351,"fingerprint":"docs/contracts/workspace-layout.md:generic-api-key:351"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":54.0,"findings_high":7.0,"findings_medium":47.0,"findings_low":0.0,"weighted_findings":17.0,"scanned_lines":21747.0,"parse_errors":16.0},"findings":[{"rule_id":"opengrep/javascript.browser.security.insecure-document-method","severity":"high","message":"User controlled data in methods like `innerHTML`, `outerHTML` or `document.write` is an anti-pattern that can lead to XSS vulnerabilities [confidence low]","path":"foundry/secondchair-foundry/scripts/main.js","line":217,"fingerprint":"javascript.browser.security.insecure-document-method:foundry/secondchair-foundry/scripts/main.js:217"},{"rule_id":"opengrep/javascript.browser.security.insecure-innerhtml","severity":"high","message":"User controlled data in a `content.innerHTML` is an anti-pattern that can lead to XSS vulnerabilities [confidence low]","path":"foundry/secondchair-foundry/scripts/main.js","line":217,"fingerprint":"javascript.browser.security.insecure-innerhtml:foundry/secondchair-foundry/scripts/main.js:217"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'Popen' 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":"src/secondchair/bench/harness.py","line":155,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:src/secondchair/bench/harness.py:155"},{"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":"src/secondchair/bench/s2.py","line":55,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:src/secondchair/bench/s2.py:55"},{"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":"src/secondchair/core/index.py","line":684,"fingerprint":"python.sqlalchemy.security.sqlalchemy-execute-raw-query:src/secondchair/core/index.py:684"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'Popen' 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":"src/secondchair/runner.py","line":174,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:src/secondchair/runner.py:174"},{"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":"src/secondchair/transcribe.py","line":201,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:src/secondchair/transcribe.py:201"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry-pf2e/scripts/main.js","line":341,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry-pf2e/scripts/main.js:341"},{"rule_id":"opengrep/javascript.lang.security.audit.unsafe-dynamic-method","severity":"medium","message":"Using non-static data to retrieve and run functions from the object is dangerous. If the data is user-controlled, it may allow executing arbitrary code. [confidence low]","path":"foundry/secondchair-foundry/scripts/actions.js","line":159,"fingerprint":"javascript.lang.security.audit.unsafe-dynamic-method:foundry/secondchair-foundry/scripts/actions.js:159"},{"rule_id":"opengrep/javascript.lang.security.audit.unsafe-dynamic-method","severity":"medium","message":"Using non-static data to retrieve and run functions from the object is dangerous. If the data is user-controlled, it may allow executing arbitrary code. [confidence low]","path":"foundry/secondchair-foundry/scripts/actions.js","line":190,"fingerprint":"javascript.lang.security.audit.unsafe-dynamic-method:foundry/secondchair-foundry/scripts/actions.js:190"},{"rule_id":"opengrep/javascript.lang.security.audit.unsafe-dynamic-method","severity":"medium","message":"Using non-static data to retrieve and run functions from the object is dangerous. If the data is user-controlled, it may allow executing arbitrary code. [confidence low]","path":"foundry/secondchair-foundry/scripts/actions.js","line":195,"fingerprint":"javascript.lang.security.audit.unsafe-dynamic-method:foundry/secondchair-foundry/scripts/actions.js:195"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":145,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:145"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":146,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:146"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":150,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:150"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":161,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:161"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":161,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:161"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":171,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:171"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":180,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:180"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":180,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:180"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":180,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:180"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":181,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:181"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":190,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:190"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":192,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:192"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":197,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:197"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":198,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:198"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":203,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:203"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":215,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:215"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":215,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:215"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":218,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:218"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":218,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:218"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":220,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:220"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":221,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:221"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":251,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:251"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":273,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:273"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":274,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:274"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":280,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:280"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":280,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:280"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":283,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:283"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":301,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:301"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":302,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:302"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":302,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:302"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":302,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:302"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":320,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:320"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":342,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:342"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":345,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:345"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":347,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:347"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":352,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:352"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":360,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:360"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/desk.js","line":363,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/desk.js:363"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"foundry/secondchair-foundry/scripts/main.js","line":91,"fingerprint":"javascript.lang.security.html-in-template-string:foundry/secondchair-foundry/scripts/main.js:91"},{"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":"src/secondchair/cli.py","line":666,"fingerprint":"python.lang.security.audit.dynamic-urllib-use-detected:src/secondchair/cli.py:666"},{"rule_id":"opengrep/python.lang.security.audit.formatted-sql-query","severity":"medium","message":"Detected possible formatted SQL query. Use parameterized queries instead. [confidence low]","path":"src/secondchair/core/index.py","line":168,"fingerprint":"python.lang.security.audit.formatted-sql-query:src/secondchair/core/index.py:168"},{"rule_id":"opengrep/python.lang.security.audit.formatted-sql-query","severity":"medium","message":"Detected possible formatted SQL query. Use parameterized queries instead. [confidence low]","path":"src/secondchair/core/index.py","line":684,"fingerprint":"python.lang.security.audit.formatted-sql-query:src/secondchair/core/index.py:684"},{"rule_id":"opengrep/python.lang.security.audit.formatted-sql-query","severity":"medium","message":"Detected possible formatted SQL query. Use parameterized queries instead. [confidence low]","path":"src/secondchair/review.py","line":260,"fingerprint":"python.lang.security.audit.formatted-sql-query:src/secondchair/review.py:260"}],"evidence":[],"data":{"rulesets":["python","javascript","typescript"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":3.0,"vulnerabilities":6.0,"vulns_critical":0.0,"vulns_high":1.0,"vulns_medium":3.0,"vulns_low":2.0,"vulns_unknown":0.0,"penalty":14.0},"findings":[{"rule_id":"osv/GHSA-cx6f-vjhg-g3cc","severity":"high","message":"virtualenv@21.14.11 (PyPI) is affected by GHSA-cx6f-vjhg-g3cc","path":"uv.lock","line":null,"fingerprint":"virtualenv@21.14.11 (PyPI):GHSA-cx6f-vjhg-g3cc"},{"rule_id":"osv/GHSA-w74x-v6f9-j3xg","severity":"medium","message":"fast-uri@3.1.8 (npm) is affected by GHSA-w74x-v6f9-j3xg","path":"package-lock.json","line":null,"fingerprint":"fast-uri@3.1.8 (npm):GHSA-w74x-v6f9-j3xg"},{"rule_id":"osv/GHSA-wjr9-j795-jxcr","severity":"medium","message":"fast-uri@3.1.8 (npm) is affected by GHSA-wjr9-j795-jxcr","path":"package-lock.json","line":null,"fingerprint":"fast-uri@3.1.8 (npm):GHSA-wjr9-j795-jxcr"},{"rule_id":"osv/GHSA-mf5v-w3w3-f6cg","severity":"medium","message":"opentelemetry-api@1.45.1 (PyPI) is affected by GHSA-mf5v-w3w3-f6cg","path":"uv.lock","line":null,"fingerprint":"opentelemetry-api@1.45.1 (PyPI):GHSA-mf5v-w3w3-f6cg"},{"rule_id":"osv/GHSA-333x-w4r6-6crp","severity":"low","message":"fast-uri@3.1.8 (npm) is affected by GHSA-333x-w4r6-6crp","path":"package-lock.json","line":null,"fingerprint":"fast-uri@3.1.8 (npm):GHSA-333x-w4r6-6crp"},{"rule_id":"osv/GHSA-xhq7-xmqj-769h","severity":"low","message":"fast-uri@3.1.8 (npm) is affected by GHSA-xhq7-xmqj-769h","path":"package-lock.json","line":null,"fingerprint":"fast-uri@3.1.8 (npm):GHSA-xhq7-xmqj-769h"}],"evidence":[],"data":{"ecosystems":["PyPI","npm"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":1.0,"findings":0.0,"findings_high":0.0,"findings_medium":0.0,"findings_low":0.0,"penalty":0.0},"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":1.0,"check:lockfiles":1.0,"signed_commit_share":0.7486,"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":1266.0,"function_nloc":14931.0,"mean_ccn":4.82,"p90_ccn":11.0,"complex_functions":70.0,"long_functions":9.0,"many_param_functions":16.0,"risky_nloc_share":0.2963},"findings":[],"evidence":[{"kind":"complex-function","description":"check in src/secondchair/core/mystery.py: complexity 58, 122 lines","ref":"src/secondchair/core/mystery.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/mystery.py#L37","weight":0.9666666666666667},{"kind":"complex-function","description":"check_state in src/secondchair/core/world.py: complexity 55, 129 lines","ref":"src/secondchair/core/world.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/world.py#L73","weight":0.9166666666666666},{"kind":"complex-function","description":"validate in src/secondchair/core/world.py: complexity 55, 110 lines","ref":"src/secondchair/core/world.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/world.py#L897","weight":0.9166666666666666},{"kind":"complex-function","description":"main in src/secondchair/cli.py: complexity 51, 491 lines","ref":"src/secondchair/cli.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/cli.py#L727","weight":0.85},{"kind":"complex-function","description":"faction_turn in src/secondchair/core/world.py: complexity 49, 90 lines","ref":"src/secondchair/core/world.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/world.py#L1030","weight":0.8166666666666667},{"kind":"complex-function","description":"message in foundry/secondchair-foundry-pf2e/scripts/outcomes.js: complexity 41, 79 lines","ref":"foundry/secondchair-foundry-pf2e/scripts/outcomes.js","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/foundry/secondchair-foundry-pf2e/scripts/outcomes.js#L103","weight":0.6833333333333333},{"kind":"complex-function","description":"session in src/secondchair/bench/synth.py: complexity 41, 148 lines","ref":"src/secondchair/bench/synth.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/bench/synth.py#L293","weight":0.6833333333333333},{"kind":"complex-function","description":"capture in src/secondchair/core/capture.py: complexity 41, 95 lines","ref":"src/secondchair/core/capture.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/capture.py#L122","weight":0.6833333333333333},{"kind":"complex-function","description":"plan in src/secondchair/core/world.py: complexity 41, 78 lines","ref":"src/secondchair/core/world.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/world.py#L347","weight":0.6833333333333333},{"kind":"complex-function","description":"validate_manifest in src/secondchair_foundry/tools.py: complexity 38, 50 lines","ref":"src/secondchair_foundry/tools.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair_foundry/tools.py#L157","weight":0.6333333333333333}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":17204.0,"duplicated_lines":106.0,"duplicated_share":0.0062,"files":78.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: foundry/secondchair-foundry/scripts/documents.js:164 and src/secondchair_foundry/tools.py:39","ref":"foundry/secondchair-foundry/scripts/documents.js","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/foundry/secondchair-foundry/scripts/documents.js#L164","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/secondchair/core/canon.py:176 and src/secondchair/core/canon.py:225","ref":"src/secondchair/core/canon.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/canon.py#L176","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/secondchair/core/capture.py:124 and src/secondchair/core/capture.py:509","ref":"src/secondchair/core/capture.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/capture.py#L124","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/secondchair/core/delegation.py:439 and src/secondchair/core/delegation.py:571","ref":"src/secondchair/core/delegation.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/delegation.py#L439","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/secondchair/core/knowledge.py:96 and src/secondchair/core/knowledge.py:241","ref":"src/secondchair/core/knowledge.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/knowledge.py#L96","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/secondchair/core/rules.py:138 and src/secondchair/core/rules.py:159","ref":"src/secondchair/core/rules.py","url":"https://github.com/Hugo-Grellier/SecondChair/blob/72137366607bddc7ffca7b83610d921fbeb077eb/src/secondchair/core/rules.py#L138","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":34.0,"weighted_findings":32.0,"scanned_lines":21747.0,"category:correctness":31.0,"category:maintainability":3.0},"findings":[{"rule_id":"opengrep/python.lang.maintainability.useless-inner-function","severity":"high","message":"function `about` is defined inside a function but never used","path":"src/secondchair/core/server.py","line":98,"fingerprint":"python.lang.maintainability.useless-inner-function:src/secondchair/core/server.py:98"},{"rule_id":"opengrep/python.lang.maintainability.useless-inner-function","severity":"high","message":"function `gm_gesture` is defined inside a function but never used","path":"src/secondchair/core/server.py","line":108,"fingerprint":"python.lang.maintainability.useless-inner-function:src/secondchair/core/server.py:108"},{"rule_id":"opengrep/javascript.lang.correctness.no-replaceall","severity":"medium","message":"The string method replaceAll is not supported in all versions of javascript, and is not supported by older browser versions. Consider using replace() with a regex as the first argument instead like mystring.replace(/bad/g, \"good\") instead of mystring.replaceAll(\"bad\", \"good\") (https://discourse.thre","path":"foundry/secondchair-foundry-pf2e/scripts/outcomes.js","line":37,"fingerprint":"javascript.lang.correctness.no-replaceall:foundry/secondchair-foundry-pf2e/scripts/outcomes.js:37"},{"rule_id":"opengrep/javascript.lang.correctness.no-replaceall","severity":"medium","message":"The string method replaceAll is not supported in all versions of javascript, and is not supported by older browser versions. Consider using replace() with a regex as the first argument instead like mystring.replace(/bad/g, \"good\") instead of mystring.replaceAll(\"bad\", \"good\") (https://discourse.thre","path":"foundry/secondchair-foundry-pf2e/scripts/outcomes.js","line":37,"fingerprint":"javascript.lang.correctness.no-replaceall:foundry/secondchair-foundry-pf2e/scripts/outcomes.js:37"},{"rule_id":"opengrep/javascript.lang.correctness.no-replaceall","severity":"medium","message":"The string method replaceAll is not supported in all versions of javascript, and is not supported by older browser versions. Consider using replace() with a regex as the first argument instead like mystring.replace(/bad/g, \"good\") instead of mystring.replaceAll(\"bad\", \"good\") (https://discourse.thre","path":"foundry/secondchair-foundry-pf2e/scripts/outcomes.js","line":37,"fingerprint":"javascript.lang.correctness.no-replaceall:foundry/secondchair-foundry-pf2e/scripts/outcomes.js:37"},{"rule_id":"opengrep/javascript.lang.correctness.no-replaceall","severity":"medium","message":"The string method replaceAll is not supported in all versions of javascript, and is not supported by older browser versions. Consider using replace() with a regex as the first argument instead like mystring.replace(/bad/g, \"good\") instead of mystring.replaceAll(\"bad\", \"good\") (https://discourse.thre","path":"foundry/secondchair-foundry-pf2e/scripts/outcomes.js","line":37,"fingerprint":"javascript.lang.correctness.no-replaceall:foundry/secondchair-foundry-pf2e/scripts/outcomes.js:37"},{"rule_id":"opengrep/javascript.lang.correctness.no-replaceall","severity":"medium","message":"The string method replaceAll is not supported in all versions of javascript, and is not supported by older browser versions. Consider using replace() with a regex as the first argument instead like mystring.replace(/bad/g, \"good\") instead of mystring.replaceAll(\"bad\", \"good\") (https://discourse.thre","path":"foundry/secondchair-foundry-pf2e/scripts/outcomes.js","line":37,"fingerprint":"javascript.lang.correctness.no-replaceall:foundry/secondchair-foundry-pf2e/scripts/outcomes.js:37"},{"rule_id":"opengrep/javascript.lang.correctness.no-replaceall","severity":"medium","message":"The string method replaceAll is not supported in all versions of javascript, and is not supported by older browser versions. Consider using replace() with a regex as the first argument instead like mystring.replace(/bad/g, \"good\") instead of mystring.replaceAll(\"bad\", \"good\") (https://discourse.thre","path":"foundry/secondchair-foundry-pf2e/scripts/outcomes.js","line":37,"fingerprint":"javascript.lang.correctness.no-replaceall:foundry/secondchair-foundry-pf2e/scripts/outcomes.js:37"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/bench/recall.py","line":125,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/bench/recall.py:125"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/bench/recall.py","line":133,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/bench/recall.py:133"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/bench/recall.py","line":136,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/bench/recall.py:136"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/bench/report.py","line":149,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/bench/report.py:149"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/bench/s2.py","line":147,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/bench/s2.py:147"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/bench/s2.py","line":158,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/bench/s2.py:158"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/cli.py","line":524,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/cli.py:524"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"src/secondchair/core/journal.py","line":35,"fingerprint":"python.lang.maintainability.return-not-in-function:src/secondchair/core/journal.py:35"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/core/mystery.py","line":215,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/core/mystery.py:215"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/core/traces.py","line":181,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/core/traces.py:181"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair/core/traces.py","line":189,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair/core/traces.py:189"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair_foundry/desk.py","line":165,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair_foundry/desk.py:165"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair_foundry/desk.py","line":181,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair_foundry/desk.py:181"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair_pf2e/checks.py","line":62,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair_pf2e/checks.py:62"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair_pf2e/checks.py","line":113,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair_pf2e/checks.py:113"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair_pf2e/checks.py","line":158,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair_pf2e/checks.py:158"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair_pf2e/checks.py","line":174,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair_pf2e/checks.py:174"},{"rule_id":"opengrep/python.lang.correctness.common-mistakes.string-concat-in-list","severity":"medium","message":"Detected strings that are implicitly concatenated inside a list. Python will implicitly concatenate strings when not explicitly delimited. Was this supposed to be individual elements of the list?","path":"src/secondchair_pf2e/checks.py","line":270,"fingerprint":"python.lang.correctness.common-mistakes.string-concat-in-list:src/secondchair_pf2e/checks.py:270"},{"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":"foundry/secondchair-foundry/scripts/documents.js","line":202,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:foundry/secondchair-foundry/scripts/documents.js:202"},{"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":"foundry/secondchair-foundry/scripts/documents.js","line":202,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:foundry/secondchair-foundry/scripts/documents.js:202"},{"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":"foundry/secondchair-foundry/scripts/documents.js","line":296,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:foundry/secondchair-foundry/scripts/documents.js:296"},{"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":"foundry/secondchair-foundry/scripts/documents.js","line":296,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:foundry/secondchair-foundry/scripts/documents.js:296"},{"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":"foundry/secondchair-foundry/scripts/main.js","line":191,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:foundry/secondchair-foundry/scripts/main.js: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":"foundry/secondchair-foundry/scripts/main.js","line":191,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:foundry/secondchair-foundry/scripts/main.js: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":"foundry/secondchair-foundry/scripts/scenes.js","line":341,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:foundry/secondchair-foundry/scripts/scenes.js:341"},{"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":"foundry/secondchair-foundry/scripts/scenes.js","line":341,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:foundry/secondchair-foundry/scripts/scenes.js:341"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":1.0,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":1.0,"check:tests_cochange":1.0,"test_lines":19704.0,"source_lines":21747.0,"test_ratio":0.9061,"ci_files":1.0,"cochange_share":1.0,"cochange_commits":105.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/ci.yml","ref":".github/workflows/ci.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (pytest)","ref":null,"url":null,"weight":0.0},{"kind":"ci","description":"CI runs linters (ruff, biome)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["pytest"],"lint_commands":["ruff","biome"]},"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":93.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.0124,"check:low_escape_density":0.0,"escapes":225.0,"escapes_per_kloc":12.723},"findings":[],"evidence":[{"kind":"typing","description":"TypeScript strict type checking: tsconfig.json","ref":"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":21699.0,"other_lines":48.0,"files_blamed":78.0,"blame_failures":0.0,"quality:ai_findings":34.0,"quality:ai_per_kloc":1.567,"quality:other_findings":0.0,"quality:other_per_kloc":0.0,"security:ai_findings":54.0,"security:ai_per_kloc":2.489,"security:other_findings":0.0,"security:other_per_kloc":0.0},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":[]}